Index: src/main/cpp/threadcxx.cpp =================================================================== --- src/main/cpp/threadcxx.cpp (revision 673097) +++ src/main/cpp/threadcxx.cpp (working copy) @@ -145,8 +145,21 @@ join(); } +namespace { + extern "C" { + APR_DECLARE_NONSTD(apr_status_t) ThreadPlainCleanup(void *data) { + Thread* pThis = (Thread*) data; + if (pThis->isAlive()) { + pThis->interrupt(); + pThis->join(); + } + return APR_SUCCESS; + } + } +} + void Thread::run(Runnable start, void* data) { #if APR_HAS_THREADS // @@ -174,6 +187,7 @@ // create LaunchPackage on the thread's memory pool LaunchPackage* package = new(p) LaunchPackage(this, start, data); + apr_pool_cleanup_register(p.getAPRPool(), this, ThreadPlainCleanup, apr_pool_cleanup_null); stat = apr_thread_create(&thread, attrs, ThreadLaunch::launcher, package, p.getAPRPool()); if (stat != APR_SUCCESS) { Index: src/main/cpp/domconfigurator.cpp =================================================================== --- src/main/cpp/domconfigurator.cpp (revision 663255) +++ src/main/cpp/domconfigurator.cpp (working copy) @@ -44,7 +44,10 @@ #include #include #include +#include +#include + using namespace log4cxx; using namespace log4cxx::xml; using namespace log4cxx::helpers; @@ -62,6 +65,13 @@ } /** + * Placement new for XMLWatchdog in pool. + */ + static void* operator new(size_t sz, apr_pool_t* p) { + return apr_palloc(p, sz); + } + + /** Call DOMConfigurator#doConfigure with the filename to reconfigure log4cxx. */ @@ -804,7 +814,8 @@ { File file(filename); #if APR_HAS_THREADS - XMLWatchdog * xdog = new XMLWatchdog(file); + apr_pool_t* rootPool = APRInitializer::getRootPool(); + XMLWatchdog * xdog = new (rootPool) XMLWatchdog(file); xdog->setDelay(delay); xdog->start(); #else @@ -817,7 +828,8 @@ { File file(filename); #if APR_HAS_THREADS - XMLWatchdog * xdog = new XMLWatchdog(file); + apr_pool_t* rootPool = APRInitializer::getRootPool(); + XMLWatchdog * xdog = new (rootPool) XMLWatchdog(file); xdog->setDelay(delay); xdog->start(); #else @@ -831,7 +843,8 @@ { File file(filename); #if APR_HAS_THREADS - XMLWatchdog * xdog = new XMLWatchdog(file); + apr_pool_t* rootPool = APRInitializer::getRootPool(); + XMLWatchdog * xdog = new (rootPool) XMLWatchdog(file); xdog->setDelay(delay); xdog->start(); #else @@ -845,7 +858,8 @@ { File file(filename); #if APR_HAS_THREADS - XMLWatchdog * xdog = new XMLWatchdog(file); + apr_pool_t* rootPool = APRInitializer::getRootPool(); + XMLWatchdog * xdog = new (rootPool) XMLWatchdog(file); xdog->setDelay(delay); xdog->start(); #else Index: src/main/cpp/propertyconfigurator.cpp =================================================================== --- src/main/cpp/propertyconfigurator.cpp (revision 663255) +++ src/main/cpp/propertyconfigurator.cpp (working copy) @@ -38,6 +38,7 @@ #include #include #include +#include using namespace log4cxx; @@ -55,6 +56,13 @@ PropertyWatchdog(const File& filename) : FileWatchdog(filename) { } + + /** + * Placement new for PropertyWatchdog in pool. + */ + static void* operator new(size_t sz, apr_pool_t* p) { + return apr_palloc(p, sz); + } /** Call PropertyConfigurator#doConfigure(const String& configFileName, @@ -130,11 +138,11 @@ } - void PropertyConfigurator::configureAndWatch( const File& configFilename, long delay) { - PropertyWatchdog * pdog = new PropertyWatchdog(configFilename); + apr_pool_t* rootPool = APRInitializer::getRootPool(); + PropertyWatchdog * pdog = new (rootPool) PropertyWatchdog(configFilename); pdog->setDelay(delay); pdog->start(); } Index: src/main/cpp/filewatchdog.cpp =================================================================== --- src/main/cpp/filewatchdog.cpp (revision 663255) +++ src/main/cpp/filewatchdog.cpp (working copy) @@ -20,10 +20,8 @@ #include #include #include -#include -#include +#include - using namespace log4cxx; using namespace log4cxx::helpers; @@ -38,7 +36,7 @@ } FileWatchdog::~FileWatchdog() { - apr_atomic_set32(&interrupted, 0xFFFF); + thread.interrupt(); thread.join(); } @@ -70,16 +68,13 @@ void* APR_THREAD_FUNC FileWatchdog::run(apr_thread_t* /* thread */, void* data) { FileWatchdog* pThis = (FileWatchdog*) data; - unsigned int interrupted = apr_atomic_read32(&pThis->interrupted); - while(!interrupted) - { - apr_sleep(APR_INT64_C(1000) * pThis->delay); - interrupted = apr_atomic_read32(&pThis->interrupted); - if (!interrupted) { - pThis->checkAndConfigure(); - interrupted = apr_atomic_read32(&pThis->interrupted); + try { + while(true) { + Thread::sleep(pThis->delay); + pThis->checkAndConfigure(); + } + } catch (InterruptedException& ex) { } - } return NULL; } Index: src/main/include/log4cxx/helpers/thread.h =================================================================== --- src/main/include/log4cxx/helpers/thread.h (revision 673097) +++ src/main/include/log4cxx/helpers/thread.h (working copy) @@ -106,7 +106,7 @@ apr_thread_cond_t* interruptedCondition; Thread(const Thread&); Thread& operator=(const Thread&); - friend void* LOG4CXX_THREAD_FUNC ThreadLaunch::launcher(apr_thread_t* thread, void* data); + friend void* LOG4CXX_THREAD_FUNC ThreadLaunch::launcher(apr_thread_t* thread, void* data); }; } // namespace helpers } // namespace log4cxx Index: src/examples/cpp/trivial.cpp =================================================================== --- src/examples/cpp/trivial.cpp (revision 668828) +++ src/examples/cpp/trivial.cpp (working copy) @@ -21,6 +21,8 @@ #include #include #include +#include +#include using namespace log4cxx; using namespace log4cxx::helpers; @@ -31,13 +33,14 @@ int result = EXIT_SUCCESS; try { - BasicConfigurator::configure(); + PropertyConfigurator::configureAndWatch("input/patternlayout1.properties"); LoggerPtr rootLogger = Logger::getRootLogger(); NDC::push("trivial context"); LOG4CXX_DEBUG(rootLogger, "debug message") LOG4CXX_INFO(rootLogger, "info message") + Thread::sleep(130000); LOG4CXX_WARN(rootLogger, "warn message") LOG4CXX_ERROR(rootLogger, "error message") LOG4CXX_FATAL(rootLogger, "fatal message") @@ -48,6 +51,5 @@ { result = EXIT_FAILURE; } - return result; }