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();