Author: joseph
Date: Mon Feb 17 19:50:37 2014
New Revision: 1569099

URL: http://svn.apache.org/r1569099
Log:
LOGCXX-390
LOGCXX-342

Modified:
    incubator/log4cxx/trunk/src/main/cpp/aprinitializer.cpp
    incubator/log4cxx/trunk/src/main/cpp/domconfigurator.cpp
    incubator/log4cxx/trunk/src/main/cpp/propertyconfigurator.cpp
    incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/aprinitializer.h

Modified: incubator/log4cxx/trunk/src/main/cpp/aprinitializer.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/aprinitializer.cpp?rev=1569099&r1=1569098&r2=1569099&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/aprinitializer.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/aprinitializer.cpp Mon Feb 17 19:50:37 
2014
@@ -59,7 +59,7 @@ APRInitializer::~APRInitializer() {
         synchronized sync(mutex);
         apr_threadkey_private_delete(tlsKey);
 #endif
-        for(std::vector<FileWatchdog*>::iterator iter = watchdogs.begin();
+        for(std::list<FileWatchdog*>::iterator iter = watchdogs.begin();
             iter != watchdogs.end();
             iter++) {
             delete *iter;
@@ -95,3 +95,19 @@ void APRInitializer::registerCleanup(Fil
     instance.watchdogs.push_back(watchdog);
 }
 
+void APRInitializer::unregisterCleanup(FileWatchdog* watchdog) {
+    APRInitializer& instance(getInstance());
+#if APR_HAS_THREADS
+    synchronized sync(instance.mutex);
+#endif
+    for(std::list<FileWatchdog*>::iterator iter = instance.watchdogs.begin();
+        iter != instance.watchdogs.end();
+        iter++) {
+               if(*iter == watchdog)
+               {
+                       instance.watchdogs.erase(iter);
+                       return;
+               }
+    }
+}
+

Modified: incubator/log4cxx/trunk/src/main/cpp/domconfigurator.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/domconfigurator.cpp?rev=1569099&r1=1569098&r2=1569099&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/domconfigurator.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/domconfigurator.cpp Mon Feb 17 
19:50:37 2014
@@ -821,7 +821,11 @@ void DOMConfigurator::configureAndWatch(
 {
         File file(filename);
 #if APR_HAS_THREADS
-               if( xdog ) delete xdog;
+               if( xdog )
+               {
+                       APRInitializer::unregisterCleanup(xdog);
+                       delete xdog;
+               }
         xdog = new XMLWatchdog(file);
         APRInitializer::registerCleanup(xdog);
         xdog->setDelay(delay);
@@ -836,7 +840,11 @@ void DOMConfigurator::configureAndWatch(
 {
         File file(filename);
 #if APR_HAS_THREADS
-               if( xdog ) delete xdog;
+               if( xdog )
+               {
+                       APRInitializer::unregisterCleanup(xdog);
+                       delete xdog;
+               }
         xdog = new XMLWatchdog(file);
         APRInitializer::registerCleanup(xdog);
         xdog->setDelay(delay);
@@ -852,7 +860,11 @@ void DOMConfigurator::configureAndWatch(
 {
         File file(filename);
 #if APR_HAS_THREADS
-               if( xdog ) delete xdog;
+               if( xdog )
+               {
+                       APRInitializer::unregisterCleanup(xdog);
+                       delete xdog;
+               }
         xdog = new XMLWatchdog(file);
         APRInitializer::registerCleanup(xdog);
         xdog->setDelay(delay);
@@ -868,7 +880,11 @@ void DOMConfigurator::configureAndWatch(
 {
         File file(filename);
 #if APR_HAS_THREADS
-               if( xdog ) delete xdog;
+               if( xdog )
+               {
+                       APRInitializer::unregisterCleanup(xdog);
+                       delete xdog;
+               }
         xdog = new XMLWatchdog(file);
         APRInitializer::registerCleanup(xdog);
         xdog->setDelay(delay);

Modified: incubator/log4cxx/trunk/src/main/cpp/propertyconfigurator.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/propertyconfigurator.cpp?rev=1569099&r1=1569098&r2=1569099&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/propertyconfigurator.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/propertyconfigurator.cpp Mon Feb 17 
19:50:37 2014
@@ -141,7 +141,10 @@ void PropertyConfigurator::configureAndW
         const File& configFilename, long delay)
 {
        if(pdog)
+       {
+           APRInitializer::unregisterCleanup(pdog);    
                delete pdog;
+       }
     pdog = new PropertyWatchdog(configFilename);
     APRInitializer::registerCleanup(pdog);
     pdog->setDelay(delay);

Modified: 
incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/aprinitializer.h
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/aprinitializer.h?rev=1569099&r1=1569098&r2=1569099&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/aprinitializer.h 
(original)
+++ incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/aprinitializer.h 
Mon Feb 17 19:50:37 2014
@@ -22,7 +22,7 @@
 #error "aprinitializer.h should only be included by log4cxx implementation"
 #endif
 
-#include <vector>
+#include <list>
 
 extern "C" {
 typedef struct apr_thread_mutex_t apr_thread_mutex_t;
@@ -51,6 +51,7 @@ namespace log4cxx
      *    allocated on heap and not deleted elsewhere.
      */
     static void registerCleanup(FileWatchdog* watchdog);
+       static void unregisterCleanup(FileWatchdog* watchdog);
 
     private:
       APRInitializer();
@@ -58,7 +59,7 @@ namespace log4cxx
       APRInitializer& operator=(const APRInitializer&);
       apr_pool_t* p;
       apr_thread_mutex_t* mutex;
-      std::vector<FileWatchdog*> watchdogs; 
+      std::list<FileWatchdog*> watchdogs; 
       apr_time_t startTime;
       apr_threadkey_t* tlsKey;
       static APRInitializer& getInstance();


Reply via email to