Uploaded image for project: 'Log4cxx'
  1. Log4cxx
  2. LOGCXX-451

Application hang up during exit on Windows

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 0.11.0
    • Fix Version/s: None
    • Component/s: Configurator
    • Labels:
      None
    • Environment:
      Windows

      Description

      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?

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              Haster John.Rembo

              Dates

              • Created:
                Updated:

                Issue deployment