>From Thorsten Schöning <tschoen...@am-soft.de>
>reply-to Log4CXX User <log4cxx-user@logging.apache.org>
>to Log4CXX User <log4cxx-user@logging.apache.org>
>date 15 October 2010 11:14
>subject apr_terminate called too early...
>mailing list <log4cxx-user.logging.apache.org> Filter messages from
this mailing list
>
>Hello,
>
>I have a GUI-application in Borland C++-Builder 5 which I needed to
>add logging support using log4cxx. It started fine but I noticed
>problems after closing the application. Like others on the net I have
>the problem that the application crashes during accessing or deleting
>some mutexes during destruction of different objects. Because I didn't
>find a real solution or advice what might be the problem, just some
>infos on locking problems or stuff like that, I tried to look into
>this myself.
>
>What I have found is that apr_terminate is called during
>deconstruction of APRInitializer before the access problems or
>exceptions occur. This makes sense, because the problem was that some
>apr-mutexes where inaccessible in some point during application
>shutdown and all those mutexes are owned by apr, if I understood
>correctly.
>
>From my point of view I would have expected that apr_terminate is the
>last thing called in Log4cxx but it seems that after deconstruction of
>APRInitializer and apr_terminate deconstructing objects just continues
>with some Loggers, Appenders etc. All of them use mutexes which aren't
>available anymore if apr_terminate was called before.
>
>It does seem that theres only one instance of APRInitializer available
>during runtime and that apr_initiliaze is called only once, therefore
>the one call of apr_terminate I noticed really kills all objects and
>memory. I didn't understand how and when APRInitializer is
>deconstructed, though.
>
>So, can it be correct that apr_terminate is called before everything
>else has finished and all Objects using apr-mutexes released them
>properly? If I uncomment apr_terminate, the application seems to
>finish properly.
>
>Mit freundlichen Grüßen,
>
>Thorsten Schöning
>
>--
>Thorsten Schöning
>AM-SoFT IT-Systeme - Hameln | Potsdam | Leipzig
>
>Telefon: Potsdam: 0331-743881-0
>E-Mail: tschoen...@am-soft.de
>Web: http://www.am-soft.de
>
>AM-SoFT GmbH IT-Systeme, Konsumhof 1-5, 14482 Potsdam
>Amtsgericht Potsdam HRB 21278 P, Geschäftsführer: Andreas Muchow
We ran into the same issue viz-a-vis APRInitializer in the product we
were building - see
http://mail-archives.apache.org/mod_mbox/logging-log4cxx-dev/200901.mbox/%3c4975157f.8070...@purplescarab.com%3e
for a discussion.
Ensuring safe order of destruction of objects in C++ (especially if
there are statics, & also especially so if there are multiple threads)
is fraught with difficulty.
The ideal solution (imho) would be to implement a "Singleton holder" as
discussed in the above link to guarantee a correct/safe order of
destruction.
However, in the absence of sufficient time/resources to remodel log4cxx
along these lines we ended up (as a "dirty" but pragmatic measure)
patching our log4cxx by commenting out apr_terminate (just as you suggest).
Hth,
Rhosyn