You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Stephen Webb (Jira)" <lo...@logging.apache.org> on 2022/09/03 07:21:00 UTC

[jira] [Commented] (LOGCXX-451) Application hang up during exit on Windows

    [ https://issues.apache.org/jira/browse/LOGCXX-451?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17599828#comment-17599828 ] 

Stephen Webb commented on LOGCXX-451:
-------------------------------------

May be fixed by [https://github.com/apache/logging-log4cxx/pull/121]

however I was not able to replicate the problem before these changes

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