Author: carnold
Date: Tue Jul  3 14:27:10 2007
New Revision: 552987

URL: http://svn.apache.org/viewvc?view=rev&rev=552987
Log:
LOGCXX-186: Synchronization changes unlikely related to observed bug

Modified:
    logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h
    logging/log4cxx/trunk/include/log4cxx/fileappender.h
    logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
    logging/log4cxx/trunk/include/log4cxx/hierarchy.h
    logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h
    logging/log4cxx/trunk/include/log4cxx/writerappender.h
    logging/log4cxx/trunk/src/appenderskeleton.cpp
    logging/log4cxx/trunk/src/asyncappender.cpp
    logging/log4cxx/trunk/src/fileappender.cpp
    logging/log4cxx/trunk/src/hierarchy.cpp
    logging/log4cxx/trunk/src/logger.cpp
    logging/log4cxx/trunk/src/objectptr.cpp
    logging/log4cxx/trunk/src/socketappenderskeleton.cpp
    logging/log4cxx/trunk/src/sockethubappender.cpp
    logging/log4cxx/trunk/src/telnetappender.cpp
    logging/log4cxx/trunk/src/writerappender.cpp

Modified: logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h Tue Jul  3 
14:27:10 2007
@@ -67,7 +67,7 @@
                 /**
                 Is this appender closed?
                 */
-                volatile unsigned int closed;
+                bool closed;
 
                 log4cxx::helpers::Pool pool;
                 log4cxx::helpers::Mutex mutex;

Modified: logging/log4cxx/trunk/include/log4cxx/fileappender.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/fileappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/fileappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/fileappender.h Tue Jul  3 14:27:10 
2007
@@ -61,8 +61,6 @@
                 How big should the IO buffer be? Default is 8K. */
                 int bufferSize;
 
-                volatile unsigned int fileClosed;
-
         public:
                 DECLARE_LOG4CXX_OBJECT(FileAppender)
                 BEGIN_LOG4CXX_CAST_MAP()
@@ -186,8 +184,7 @@
                 <p>Note: Actual opening of the file is made when
                 #activateOptions is called, not when the options are set.
                 */
-                inline void setAppend(bool fileAppend1)
-                                { this->fileAppend = fileAppend1; }
+                void setAppend(bool fileAppend1);
 
                 /**
                 The <b>BufferedIO</b> option takes a boolean value. It is set 
to

Modified: logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h Tue Jul  3 
14:27:10 2007
@@ -28,7 +28,8 @@
         class LOG4CXX_EXPORT ObjectPtrBase {
         public:
             static void checkNull(const int& null);
-            static void* exchange(volatile void** destination, void* newValue);
+            static void* exchange(void** destination, void* newValue);
+            static void* unsynchronizedExchange(void** destination, void* 
newValue);
         };
 
 
@@ -37,32 +38,35 @@
         {
         public:
          template<typename InterfacePtr> ObjectPtrT(const InterfacePtr& p1)
-            : p(0)
          {
+             ObjectPtrBase::exchange((void**) &p, 0);
              cast(p1);
          }
 
 
          ObjectPtrT(const int& null) //throw(IllegalArgumentException)
-                : p(0)
          {
+                ObjectPtrBase::exchange((void**) &p, 0);
                 ObjectPtrBase::checkNull(null);
          }
 
-         ObjectPtrT() : p(0)
+         ObjectPtrT()
          {
+                ObjectPtrBase::exchange((void**) &p, 0);
          }
 
-         ObjectPtrT(T * p1) : p(p1)
+         ObjectPtrT(T * p1)
             {
+                ObjectPtrBase::exchange((void**) &p, p1);
                 if (this->p != 0)
                 {
                     this->p->addRef();
                 }
             }
 
-            ObjectPtrT(const ObjectPtrT& p1) : p(p1.p)
+            ObjectPtrT(const ObjectPtrT& p1)
             {
+                ObjectPtrBase::exchange((void**) &p, p1.p);
                 if (this->p != 0)
                 {
                     this->p->addRef();
@@ -71,7 +75,7 @@
 
             ~ObjectPtrT()
             {
-              void* oldPtr = ObjectPtrBase::exchange((volatile void**) 
&this->p, 0);
+              void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
               if (oldPtr != 0) {
                   ((T*) oldPtr)->releaseRef();
               }
@@ -89,7 +93,7 @@
              if (newPtr != 0) {
                  newPtr->addRef();
              }
-             void* oldPtr = ObjectPtrBase::exchange((volatile void**) 
&this->p, newPtr);
+             void* oldPtr = ObjectPtrBase::exchange((void**) &p, newPtr);
              if (oldPtr != 0) {
                  ((T*) oldPtr)->releaseRef();
              }
@@ -102,7 +106,7 @@
                 //   throws IllegalArgumentException if null != 0
                 //
                 ObjectPtrBase::checkNull(null);
-                void* oldPtr = ObjectPtrBase::exchange((volatile void**) 
&this->p, 0);
+                void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
                 if (oldPtr != 0) {
                    ((T*) oldPtr)->releaseRef();
                 }
@@ -113,7 +117,7 @@
               if (p1 != 0) {
                 p1->addRef();
               }
-              void* oldPtr = ObjectPtrBase::exchange((volatile void**) 
&this->p, p1);
+              void* oldPtr = ObjectPtrBase::exchange((void**) &p, p1);
               if (oldPtr != 0) {
                  ((T*)oldPtr)->releaseRef();
               }
@@ -143,6 +147,7 @@
         private:
             T * p;
         };
+
     }
 }
 

Modified: logging/log4cxx/trunk/include/log4cxx/hierarchy.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/hierarchy.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/hierarchy.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/hierarchy.h Tue Jul  3 14:27:10 2007
@@ -66,7 +66,7 @@
         private:
             log4cxx::helpers::Pool pool;
             log4cxx::helpers::Mutex mutex;
-            volatile log4cxx_uint32_t configured;
+            bool configured;
 
             spi::LoggerFactoryPtr defaultFactory;
             spi::HierarchyEventListenerList listeners;
@@ -84,11 +84,6 @@
 
             bool emittedNoAppenderWarning;
             bool emittedNoResourceBundleWarning;
-
-            /**
-            Map synchronization
-            */
-            mutable apr_thread_mutex_t* mapCs;
 
         public:
             DECLARE_ABSTRACT_LOG4CXX_OBJECT(Hierarchy)

Modified: logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h Tue Jul  3 
14:27:10 2007
@@ -130,7 +130,7 @@
                         ConnectionList connections;
                         helpers::ServerSocket* serverSocket;
                         helpers::Thread sh;
-                        volatile unsigned int activeConnections;
+                        int activeConnections;
                         static void* LOG4CXX_THREAD_FUNC 
acceptConnections(helpers::log4cxx_thread_t* thread, void* data);
                 }; // class TelnetAppender
     } // namespace net

Modified: logging/log4cxx/trunk/include/log4cxx/writerappender.h
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/writerappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/writerappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/writerappender.h Tue Jul  3 14:27:10 
2007
@@ -100,8 +100,7 @@
                 be recorded on disk when the application exits. This is a high
                 price to pay even for a 20% performance gain.
                 */
-                void setImmediateFlush(bool value) { immediateFlush = value; }
-
+                void setImmediateFlush(bool value);
                 /**
                 Returns value of the <b>ImmediateFlush</b> option.
                 */
@@ -174,7 +173,7 @@
                   <p><b>WARNING:</b> Logging to an unopened Writer will fail.
                   <p>
                   @param writer An already opened Writer.  */
-                void setWriter(log4cxx::helpers::WriterPtr& writer);
+                void setWriter(const log4cxx::helpers::WriterPtr& writer);
 
                 virtual bool requiresLayout() const;
 

Modified: logging/log4cxx/trunk/src/appenderskeleton.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/appenderskeleton.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/appenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/appenderskeleton.cpp Tue Jul  3 14:27:10 2007
@@ -37,10 +37,11 @@
     errorHandler(new OnlyOnceErrorHandler()),
     headFilter(),
     tailFilter(),
-    closed(0),
     pool(), 
     mutex(pool)
 {
+    synchronized sync(mutex);
+    closed = false;
 }
 
 AppenderSkeleton::AppenderSkeleton(const LayoutPtr& layout1)
@@ -50,10 +51,11 @@
   errorHandler(new OnlyOnceErrorHandler()),
   headFilter(),
   tailFilter(),
-  closed(0),
   pool(),
   mutex(pool)
 {
+  synchronized sync(mutex);
+  closed = false;
 }
 
 void AppenderSkeleton::finalize()
@@ -70,6 +72,7 @@
 
 void AppenderSkeleton::addFilter(const spi::FilterPtr& newFilter)
 {
+        synchronized sync(mutex);
         if(headFilter == 0)
         {
                 headFilter = tailFilter = newFilter;
@@ -83,6 +86,7 @@
 
 void AppenderSkeleton::clearFilters()
 {
+        synchronized sync(mutex);
         headFilter = tailFilter = 0;
 }
 
@@ -146,6 +150,7 @@
 
 void AppenderSkeleton::setThreshold(const LevelPtr& threshold1)
 {
+        synchronized sync(mutex);
         this->threshold = threshold1;
 }
 

Modified: logging/log4cxx/trunk/src/asyncappender.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/asyncappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/asyncappender.cpp (original)
+++ logging/log4cxx/trunk/src/asyncappender.cpp Tue Jul  3 14:27:10 2007
@@ -109,7 +109,8 @@
 
 void AsyncAppender::close()
 {
-        apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
+        bool wasClosed = closed;
+        closed = true;
         if (!wasClosed) {
                 pending.broadcast();
                 thread.join();

Modified: logging/log4cxx/trunk/src/fileappender.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/fileappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/fileappender.cpp (original)
+++ logging/log4cxx/trunk/src/fileappender.cpp Tue Jul  3 14:27:10 2007
@@ -26,6 +26,7 @@
 #include <log4cxx/helpers/outputstreamwriter.h>
 #include <log4cxx/helpers/bufferedwriter.h>
 #include <log4cxx/helpers/bytebuffer.h>
+#include <log4cxx/helpers/synchronized.h>
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
@@ -34,34 +35,50 @@
 IMPLEMENT_LOG4CXX_OBJECT(FileAppender)
 
 
-FileAppender::FileAppender()
-: fileAppend(true), fileName(), bufferedIO(false), bufferSize(8*1024),
-  fileClosed(1)
-{
+FileAppender::FileAppender() {
+    synchronized sync(mutex);
+    fileAppend = true;
+    bufferedIO = false;
+    bufferSize = 8 * 1024;
 }
 
 FileAppender::FileAppender(const LayoutPtr& layout1, const LogString& 
fileName1,
-        bool append1, bool bufferedIO1, int bufferSize1)
-: WriterAppender(layout1), fileAppend(append1), fileName(fileName1), 
bufferedIO(bufferedIO1), bufferSize(bufferSize1),
-  fileClosed(1)
-{
+        bool append1, bool bufferedIO1, int bufferSize1) 
+           : WriterAppender(layout1) {
+        {  
+            synchronized sync(mutex);
+            fileAppend = append1;
+            fileName = fileName1;
+            bufferedIO = bufferedIO1;
+            bufferSize = bufferSize1;
+         }
         Pool p;
         activateOptions(p);
 }
 
 FileAppender::FileAppender(const LayoutPtr& layout1, const LogString& 
fileName1,
         bool append1)
-: WriterAppender(layout1), fileAppend(append1), fileName(fileName1), 
bufferedIO(false), bufferSize(8*1024),
-  fileClosed(1)
-{
+: WriterAppender(layout1) {
+        {
+            synchronized sync(mutex);
+            fileAppend = append1;
+            fileName = fileName1;
+            bufferedIO = false;
+            bufferSize = 8 * 1024;
+         }
         Pool p;
         activateOptions(p);
 }
 
 FileAppender::FileAppender(const LayoutPtr& layout1, const LogString& 
fileName1)
-: WriterAppender(layout1), fileAppend(true), fileName(fileName1),
-  bufferedIO(false), bufferSize(8*1024), fileClosed(1)
-{
+: WriterAppender(layout1) {
+        {
+            synchronized sync(mutex);
+            fileAppend = true;
+            fileName = fileName1;
+            bufferedIO = false;
+            bufferSize = 8 * 1024;
+        }
         Pool p;
         activateOptions(p);
 }
@@ -71,8 +88,14 @@
     finalize();
 }
 
+void FileAppender::setAppend(bool fileAppend1) { 
+    synchronized sync(mutex);
+    this->fileAppend = fileAppend1; 
+}
+
 void FileAppender::setFile(const LogString& file)
 {
+        synchronized sync(mutex);
         fileName = file;
 }
 
@@ -80,6 +103,7 @@
 
 void FileAppender::setBufferedIO(bool bufferedIO1)
 {
+        synchronized sync(mutex);
         this->bufferedIO = bufferedIO1;
         if(bufferedIO1)
         {
@@ -93,22 +117,27 @@
         if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("FILE"), 
LOG4CXX_STR("file"))
                 || StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("FILENAME"), LOG4CXX_STR("filename")))
         {
+                synchronized sync(mutex);
                 fileName = stripDuplicateBackslashes(value);
         }
         else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("APPEND"), 
LOG4CXX_STR("append")))
         {
+                synchronized sync(mutex);
                 fileAppend = OptionConverter::toBoolean(value, true);
         }
         else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BUFFEREDIO"), LOG4CXX_STR("bufferedio")))
         {
+                synchronized sync(mutex);
                 bufferedIO = OptionConverter::toBoolean(value, true);
         }
         else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("IMMEDIATEFLUSH"), LOG4CXX_STR("immediateflush")))
         {
+                synchronized sync(mutex);
                 bufferedIO = !OptionConverter::toBoolean(value, false);
         }
         else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BUFFERSIZE"), LOG4CXX_STR("buffersize")))
         {
+                synchronized sync(mutex);
                 bufferSize = OptionConverter::toFileSize(value, 8*1024);
         }
         else
@@ -119,6 +148,7 @@
 
 void FileAppender::activateOptions(Pool& p)
 {
+  synchronized sync(mutex);
   int errors = 0;
   if (!fileName.empty()) {
     try {

Modified: logging/log4cxx/trunk/src/hierarchy.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/hierarchy.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/hierarchy.cpp (original)
+++ logging/log4cxx/trunk/src/hierarchy.cpp Tue Jul  3 14:27:10 2007
@@ -43,13 +43,17 @@
 
 Hierarchy::Hierarchy() : 
 pool(),
-mutex(pool), configured(false),
-thresholdInt(Level::ALL_INT), threshold(Level::getAll()),
-emittedNoAppenderWarning(false), emittedNoResourceBundleWarning(false)
+mutex(pool)
 {
+        synchronized sync(mutex);
         root = new RootCategory(pool, Level::getDebug());
         root->setHierarchy(this);
         defaultFactory = new DefaultCategoryFactory();
+        emittedNoAppenderWarning = false;
+        configured = false;
+        thresholdInt = Level::ALL_INT;
+        threshold = Level::getAll();
+        emittedNoResourceBundleWarning = false;
 }
 
 Hierarchy::~Hierarchy()
@@ -58,6 +62,7 @@
 
 void Hierarchy::addHierarchyEventListener(const 
spi::HierarchyEventListenerPtr& listener)
 {
+        synchronized sync(mutex);
         if (std::find(listeners.begin(), listeners.end(), listener) != 
listeners.end())
         {
                 LogLog::warn(LOG4CXX_STR("Ignoring attempt to add an existent 
listener."));
@@ -76,13 +81,19 @@
 
 void Hierarchy::emitNoAppenderWarning(const LoggerPtr& logger)
 {
+       bool emitWarning = false;
+       { 
+           synchronized sync(mutex);
+           emitWarning = !emittedNoAppenderWarning;
+           emittedNoAppenderWarning = true;
+       }
+          
         // No appender in hierarchy, warn user only once.
-        if(!this->emittedNoAppenderWarning)
+        if(emitWarning)
         {
                 LogLog::warn(((LogString) LOG4CXX_STR("No appender could be 
found for logger ("))
                    + logger->getName() + LOG4CXX_STR(")."));
                 LogLog::warn(LOG4CXX_STR("Please initialize the log4cxx system 
properly."));
-                this->emittedNoAppenderWarning = true;
         }
 }
 
@@ -106,8 +117,9 @@
 {
         if (l != 0)
         {
-                thresholdInt = l->toInt();
-                threshold = l;
+            synchronized sync(mutex);
+            thresholdInt = l->toInt();
+            threshold = l;
             if (thresholdInt != Level::ALL_INT) {
                setConfigured(true);
             }
@@ -130,11 +142,17 @@
 
 void Hierarchy::fireAddAppenderEvent(const LoggerPtr& logger, const 
AppenderPtr& appender)
 {
-   setConfigured(true);
-    HierarchyEventListenerList::iterator it, itEnd = listeners.end();
+    setConfigured(true);
+    HierarchyEventListenerList clonedList;
+    { 
+       synchronized sync(mutex);
+       clonedList = listeners;
+    }
+
+    HierarchyEventListenerList::iterator it, itEnd = clonedList.end();
     HierarchyEventListenerPtr listener;
 
-    for(it = listeners.begin(); it != itEnd; it++)
+    for(it = clonedList.begin(); it != itEnd; it++)
         {
                 listener = *it;
                 listener->addAppenderEvent(logger, appender);
@@ -144,10 +162,15 @@
 void Hierarchy::fireRemoveAppenderEvent(const LoggerPtr& logger, const 
AppenderPtr& appender)
 
 {
-    HierarchyEventListenerList::iterator it, itEnd = listeners.end();
+    HierarchyEventListenerList clonedList;
+    { 
+       synchronized sync(mutex);
+       clonedList = listeners;
+    }
+    HierarchyEventListenerList::iterator it, itEnd = clonedList.end();
     HierarchyEventListenerPtr listener;
 
-    for(it = listeners.begin(); it != itEnd; it++)
+    for(it = clonedList.begin(); it != itEnd; it++)
         {
                 listener = *it;
                 listener->removeAppenderEvent(logger, appender);
@@ -217,13 +240,12 @@
 
 bool Hierarchy::isDisabled(int level) const
 {
-   //
-   //   if repository hasn't been configured,
-   //     do default configuration
-   //
-   if (apr_atomic_xchg32(const_cast<volatile unsigned int*>(&configured), 1) 
== 0) {
+   if(!configured) {
+      synchronized sync(mutex);
+      if (!configured) {
         DefaultConfigurator::configure(
             const_cast<Hierarchy*>(this));
+      }
    }
 
    return thresholdInt > level;
@@ -354,9 +376,10 @@
 }
 
 void Hierarchy::setConfigured(bool newValue) {
-    apr_atomic_set32(&configured, newValue ? 1 : 0);
+    synchronized sync(mutex);
+    configured = newValue;
 }
 
 bool Hierarchy::isConfigured() {
-    return configured ? true : false;
+    return configured;
 }

Modified: logging/log4cxx/trunk/src/logger.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/logger.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/logger.cpp (original)
+++ logging/log4cxx/trunk/src/logger.cpp Tue Jul  3 14:27:10 2007
@@ -39,9 +39,12 @@
 IMPLEMENT_LOG4CXX_OBJECT(Logger)
 
 Logger::Logger(Pool& pool, const LogString& name1)
-: name(name1), level(), parent(), resourceBundle(),
-repository(0), aai(), additive(true),  mutex(pool)
+: name(), level(), parent(), resourceBundle(),
+repository(), aai(), mutex(pool)
 {
+    synchronized sync(mutex);
+    name = name1;
+    additive = true;
 }
 
 Logger::~Logger()
@@ -60,9 +63,9 @@
                   aai = new AppenderAttachableImpl();
         }
         aai->addAppender(newAppender);
-               if (repository != 0) {
+       if (repository != 0) {
            repository->fireAddAppenderEvent(this, newAppender);
-               }
+       }
 }
 
 
@@ -508,6 +511,7 @@
 
 void Logger::setAdditivity(bool additive1)
 {
+        synchronized sync(mutex);
         this->additive = additive1;
 }
 

Modified: logging/log4cxx/trunk/src/objectptr.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/objectptr.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/objectptr.cpp (original)
+++ logging/log4cxx/trunk/src/objectptr.cpp Tue Jul  3 14:27:10 2007
@@ -18,19 +18,29 @@
 #include <log4cxx/logstring.h>
 #include <log4cxx/helpers/objectptr.h>
 #include <log4cxx/helpers/exception.h>
+#include <log4cxx/helpers/mutex.h>
+#include <log4cxx/helpers/aprinitializer.h>
+#include <log4cxx/helpers/synchronized.h>
 #include <apr_atomic.h>
 
 using namespace log4cxx::helpers;
 
 void ObjectPtrBase::checkNull(const int& null) {
-        if (null != 0)
-        {
-
-                throw IllegalArgumentException("Attempt to set pointer to a 
non-zero numeric value.");
-        }
+    if (null != 0) {
+       throw IllegalArgumentException("Attempt to set pointer to a non-zero 
numeric value.");
+    }
 }
 
-void* ObjectPtrBase::exchange(volatile void** destination, void* newValue) {
-   return apr_atomic_casptr(destination, newValue, (const void*) *destination);
+void* ObjectPtrBase::exchange(void** destination, void* newValue) {
+   static Mutex mutex(APRInitializer::getRootPool());
+   synchronized sync(mutex);
+   void* oldValue = *destination;
+   *destination = newValue;
+   return oldValue;
 }
 
+void* ObjectPtrBase::unsynchronizedExchange(void** destination, void* 
newValue) {
+   void* oldValue = *destination;
+   *destination = newValue;
+   return oldValue;
+}

Modified: logging/log4cxx/trunk/src/socketappenderskeleton.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/socketappenderskeleton.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/socketappenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/socketappenderskeleton.cpp Tue Jul  3 14:27:10 
2007
@@ -139,9 +139,10 @@
 
 void SocketAppenderSkeleton::close()
 {
-    apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
-        if (wasClosed) return;
-        cleanUp();
+    synchronized sync(mutex);
+    if (closed) return;
+    closed = true;
+    cleanUp();
 }
 
 void SocketAppenderSkeleton::cleanUp()
@@ -207,7 +208,7 @@
 void* APR_THREAD_FUNC SocketAppenderSkeleton::monitor(log4cxx_thread_t* /* 
thread */, void* data) {
         SocketAppenderSkeleton* socketAppender = (SocketAppenderSkeleton*) 
data;
         SocketPtr socket;
-        apr_uint32_t isClosed = apr_atomic_read32(&socketAppender->closed);
+        bool isClosed = socketAppender->closed;
         while(!isClosed)
         {
                 try
@@ -241,7 +242,7 @@
                                  + LOG4CXX_STR(". Exception is ")
                                  + exmsg);
                 }
-            isClosed = apr_atomic_read32(&socketAppender->closed);
+            isClosed = socketAppender->closed;
         }
 
         LogLog::debug(LOG4CXX_STR("Exiting Connector.run() method."));

Modified: logging/log4cxx/trunk/src/sockethubappender.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/sockethubappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/sockethubappender.cpp (original)
+++ logging/log4cxx/trunk/src/sockethubappender.cpp Tue Jul  3 14:27:10 2007
@@ -79,11 +79,16 @@
 
 void SocketHubAppender::close()
 {
-        apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
-        if (wasClosed) return;
+        {
+            synchronized sync(mutex);
+            if (closed) {
+                return;
+            }
+            closed = true;
+        }
 
         LogLog::debug(LOG4CXX_STR("closing SocketHubAppender ") + getName());
-    //
+        //
         //  wait until the server thread completes
         //
         thread.join();
@@ -168,7 +173,7 @@
                 return NULL;
         }
 
-        apr_uint32_t stopRunning = apr_atomic_read32(&pThis->closed);
+        bool stopRunning = pThis->closed;
         while (!stopRunning)
         {
                 SocketPtr socket;
@@ -183,7 +188,7 @@
                 catch (SocketException& e)
                 {
                         LogLog::error(LOG4CXX_STR("exception accepting socket, 
shutting down server socket."), e);
-                        stopRunning = 1;
+                        stopRunning = true;
                 }
                 catch (IOException& e)
                 {

Modified: logging/log4cxx/trunk/src/telnetappender.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/telnetappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/telnetappender.cpp (original)
+++ logging/log4cxx/trunk/src/telnetappender.cpp Tue Jul  3 14:27:10 2007
@@ -41,8 +41,10 @@
 
 TelnetAppender::TelnetAppender()
   : port(DEFAULT_PORT), connections(MAX_CONNECTIONS),
-    serverSocket(NULL), sh(), activeConnections(0)
+    serverSocket(NULL), sh()
 {
+   synchronized sync(mutex);
+   activeConnections = 0;
 }
 
 TelnetAppender::~TelnetAppender()
@@ -74,10 +76,9 @@
 
 void TelnetAppender::close()
 {
-        apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
-        if (wasClosed) return;
-
         synchronized sync(mutex);
+        if (closed) return;
+        closed = true;
         sh.stop();
 
         SocketPtr nullSocket;
@@ -111,7 +112,7 @@
 
 void TelnetAppender::append(const spi::LoggingEventPtr& event, Pool& /* p */)
 {
-        apr_uint32_t count = apr_atomic_read32(&activeConnections);
+        int count = activeConnections;
         if (count > 0) {
                 LogString os;
 
@@ -135,7 +136,7 @@
                                         // The client has closed the 
connection, remove it from our list:
                                         iter->first = nullSocket;
                                         iter->second = nullStream;
-                                        apr_atomic_dec32(&activeConnections);
+                                        activeConnections--;
                                 }
                         }
                 }
@@ -152,7 +153,7 @@
         {
                 SocketPtr newClient = pThis->serverSocket->accept();
                 SocketOutputStreamPtr os = newClient->getOutputStream();
-                apr_uint32_t done = apr_atomic_read32(&pThis->closed);
+                bool done = pThis->closed;
                 if (done) {
                         os->writeRaw(LOG4CXX_STR("Log closed.\r\n"));
                         os->flush();
@@ -160,7 +161,7 @@
                         return NULL;
                 }
 
-                apr_uint32_t count = 
apr_atomic_read32(&pThis->activeConnections);
+                int count = pThis->activeConnections;
                 if (count >= pThis->connections.size()) {
                         os->writeRaw(LOG4CXX_STR("Too many connections.\r\n"));
                         os->flush();
@@ -176,7 +177,7 @@
                                 if (iter->first == NULL) {
                                         iter->first = newClient;
                                         iter->second = os;
-                                        
apr_atomic_inc32(&pThis->activeConnections);
+                                        pThis->activeConnections++;
                                         break;
                                 }
                         }

Modified: logging/log4cxx/trunk/src/writerappender.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/writerappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/writerappender.cpp (original)
+++ logging/log4cxx/trunk/src/writerappender.cpp Tue Jul  3 14:27:10 2007
@@ -27,19 +27,24 @@
 
 IMPLEMENT_LOG4CXX_OBJECT(WriterAppender)
 
-WriterAppender::WriterAppender()
-: immediateFlush(true) {
+WriterAppender::WriterAppender() {
+   synchronized sync(mutex);
+   immediateFlush = true;
 }
 
 WriterAppender::WriterAppender(const LayoutPtr& layout1,
                log4cxx::helpers::WriterPtr& writer1)
-    : AppenderSkeleton(layout1), immediateFlush(true), writer(writer1) {
+    : AppenderSkeleton(layout1), writer(writer1) {
       Pool p;
+      synchronized sync(mutex);
+      immediateFlush = true;
       activateOptions(p);
 }
 
 WriterAppender::WriterAppender(const LayoutPtr& layout1)
-    : AppenderSkeleton(layout1), immediateFlush(true) {
+    : AppenderSkeleton(layout1) {
+    synchronized sync(mutex);
+    immediateFlush = true;
 }
 
 
@@ -198,9 +203,12 @@
 {
         LogString msg;
         layout->format(msg, event, p);
-        writer->write(msg, p);
-        if (immediateFlush) {
+        {
+           synchronized sync(mutex);
+           writer->write(msg, p);
+           if (immediateFlush) {
                writer->flush(p);
+           }
         }
 }
 
@@ -210,6 +218,7 @@
         if (layout != NULL) {
           LogString foot;
           layout->appendFooter(foot, p);
+          synchronized sync(mutex);
           writer->write(foot, p);
         }
 }
@@ -219,12 +228,14 @@
         if(layout != NULL) {
           LogString header;
           layout->appendHeader(header, p);
+          synchronized sync(mutex);
           writer->write(header, p);
         }
 }
 
 
-void WriterAppender::setWriter(WriterPtr& newWriter) {
+void WriterAppender::setWriter(const WriterPtr& newWriter) {
+   synchronized sync(mutex);
    writer = newWriter;
 }
 
@@ -239,4 +250,10 @@
     } else {
       AppenderSkeleton::setOption(option, value);
     }
+}
+
+
+void WriterAppender::setImmediateFlush(bool value) { 
+    synchronized sync(mutex);
+    immediateFlush = value; 
 }


Reply via email to