You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Robert Middleton (Jira)" <lo...@logging.apache.org> on 2022/09/24 13:14:00 UTC
[jira] [Resolved] (LOGCXX-451) Application hang up during exit on Windows
[ 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)