[ https://issues.apache.org/jira/browse/LOGCXX-451?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Robert Middleton resolved LOGCXX-451. ------------------------------------- Resolution: Fixed > Application hang up during exit on Windows > ------------------------------------------ > > Key: LOGCXX-451 > URL: https://issues.apache.org/jira/browse/LOGCXX-451 > Project: Log4cxx > Issue Type: Bug > Components: Configurator > Affects Versions: 0.11.0 > Environment: Windows > Reporter: John.Rembo > Assignee: Stephen Webb > Priority: Major > Fix For: 1.0.0 > > > I use such code in one of my DLL in application: > xml::DOMConfigurator::configureAndWatch("log4cxx.xml"); > PropertyConfigurator::configureAndWatch("log4cxx.properties"); > At this point watchdog threads are created and they are pushed to some > container: > void DOMConfigurator::configureAndWatch(const std::string& filename, long > delay) > { > File file(filename); > #if APR_HAS_THREADS > if( xdog ) > { > APRInitializer::unregisterCleanup(xdog); > delete xdog; > } > xdog = new XMLWatchdog(file); > APRInitializer::registerCleanup(xdog); < == watchdog pushed to > container here > xdog->setDelay(delay); > xdog->start(); > #else > DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository()); > #endif > } > void APRInitializer::registerCleanup(FileWatchdog* watchdog) { > APRInitializer& instance(getInstance()); > #if APR_HAS_THREADS > synchronized sync(instance.mutex); > #endif > instance.watchdogs.push_back(watchdog); > } > But APRInitializer is a Singletone class which is allocated static. > APRInitializer& APRInitializer::getInstance() { > static APRInitializer init; > return init; > } > Then my application stops and Dynamic Library, which uses log4cxx is unloaded > in _CRT_INIT (which is called from DllMain) function destructor for > APRInitializer object is called => and called destructors for watchdog > objects. > FileWatchdog::~FileWatchdog() { > apr_atomic_set32(&interrupted, 0xFFFF); > try { > thread.interrupt(); > thread.join(); > } catch(Exception &e) { > } > } > In thread.join() function WaitForSingleObject is called and we have deadlock, > because when some thread execute DllMain code all other threads are slept by > system. > So, one thread wait when another will stop, but another thread is slept. > Now it is impossible to call configureAndWatch from Dll. > Please fix it? -- This message was sent by Atlassian Jira (v8.20.10#820010)