Hi The following patch (the biggest from the series) changes the codes so that Logger caches a LoggerRepositoryPtr instead of a LoggerRepository* otherwise the cached pointer can get destructed before it's last use (as proved by valgrind and SIGSEGV). This patch fixes the first crash I got with log4cxx when trying to log from a destructor of a static object.
Index: include/log4cxx/spi/loggerrepository.h =================================================================== --- include/log4cxx/spi/loggerrepository.h (revision 688) +++ include/log4cxx/spi/loggerrepository.h (revision 690) @@ -41,6 +41,8 @@ class HierarchyEventListener; typedef log4cxx::helpers::ObjectPtrT<HierarchyEventListener> HierarchyEventListenerPtr; + class LoggerRepository; + typedef log4cxx::helpers::ObjectPtrT<LoggerRepository> LoggerRepositoryPtr; /** @@ -91,10 +93,12 @@ for an explanation. */ virtual const LevelPtr& getThreshold() const = 0; - virtual LoggerPtr getLogger(const LogString& name) = 0; + virtual LoggerPtr getLogger(const LogString& name, + const spi::LoggerRepositoryPtr& lrepos) = 0; virtual LoggerPtr getLogger(const LogString& name, - const spi::LoggerFactoryPtr& factory) = 0; + const spi::LoggerFactoryPtr& factory, + const spi::LoggerRepositoryPtr& lrepos) = 0; virtual LoggerPtr getRootLogger() const = 0; Index: include/log4cxx/logger.h =================================================================== --- include/log4cxx/logger.h (revision 688) +++ include/log4cxx/logger.h (revision 690) @@ -80,7 +80,7 @@ // Loggers need to know what Hierarchy they are in - spi::LoggerRepository * repository; + spi::LoggerRepositoryPtr repository; helpers::AppenderAttachableImplPtr aai; @@ -537,7 +537,7 @@ friend class Hierarchy; /** Only the Hierarchy class can set the hierarchy of a logger.*/ - void setHierarchy(spi::LoggerRepository * repository); + void setHierarchy(const spi::LoggerRepositoryPtr& repository); public: /** Index: include/log4cxx/hierarchy.h =================================================================== --- include/log4cxx/hierarchy.h (revision 688) +++ include/log4cxx/hierarchy.h (revision 690) @@ -157,7 +157,8 @@ @param name The name of the logger to retrieve. */ - LoggerPtr getLogger(const LogString& name); + LoggerPtr getLogger(const LogString& name, + const spi::LoggerRepositoryPtr& lrepos); /** Return a new logger instance named as the first parameter using @@ -173,7 +174,8 @@ */ LoggerPtr getLogger(const LogString& name, - const spi::LoggerFactoryPtr& factory); + const spi::LoggerFactoryPtr& factory, + const spi::LoggerRepositoryPtr& lrepos); /** Returns all the currently defined loggers in this hierarchy as Index: src/hierarchy.cpp =================================================================== --- src/hierarchy.cpp (revision 688) +++ src/hierarchy.cpp (revision 690) @@ -152,13 +152,15 @@ return threshold; } -LoggerPtr Hierarchy::getLogger(const LogString& name) +LoggerPtr Hierarchy::getLogger(const LogString& name, + const spi::LoggerRepositoryPtr& lrepos) { - return getLogger(name, defaultFactory); + return getLogger(name, defaultFactory, lrepos); } LoggerPtr Hierarchy::getLogger(const LogString& name, - const spi::LoggerFactoryPtr& factory) + const spi::LoggerFactoryPtr& factory, + const spi::LoggerRepositoryPtr& lrepos) { // Synchronize to prevent write conflicts. Read conflicts (in // getEffectiveLevel method) are possible only if variable @@ -177,7 +179,7 @@ { logger = factory->makeNewLoggerInstance(name); - logger->setHierarchy(this); + logger->setHierarchy(lrepos); loggers.insert(LoggerMap::value_type(name, logger)); ProvisionNodeMap::iterator it2 = provisionNodes.find(name); Index: src/logmanager.cpp =================================================================== --- src/logmanager.cpp (revision 688) +++ src/logmanager.cpp (revision 690) @@ -96,7 +96,7 @@ */ LoggerPtr LogManager::getLogger(const LogString& name) { - return getLoggerRepository()->getLogger(name); + return getLoggerRepository()->getLogger(name, getLoggerRepository()); } /** @@ -106,7 +106,7 @@ const spi::LoggerFactoryPtr& factory) { // Delegate the actual manufacturing of the logger to the logger repository. - return getLoggerRepository()->getLogger(name, factory); + return getLoggerRepository()->getLogger(name, factory, getLoggerRepository()); } LoggerPtr LogManager::exists(const std::string& name) Index: src/logger.cpp =================================================================== --- src/logger.cpp (revision 688) +++ src/logger.cpp (revision 690) @@ -517,7 +517,7 @@ this->additive = additive; } -void Logger::setHierarchy(spi::LoggerRepository * repository) +void Logger::setHierarchy(const spi::LoggerRepositoryPtr& repository) { this->repository = repository; } Index: src/socketnode.cpp =================================================================== --- src/socketnode.cpp (revision 691) +++ src/socketnode.cpp (revision 692) @@ -59,7 +59,7 @@ else { remoteLogger = - hierarchy->getLogger(event->getLoggerName()); + hierarchy->getLogger(event->getLoggerName(), hierarchy); } // apply the logger-level filter Index: tests/src/loggertestcase.cpp =================================================================== --- tests/src/loggertestcase.cpp (revision 691) +++ tests/src/loggertestcase.cpp (revision 692) @@ -387,12 +387,12 @@ { LoggerPtr root(new RootCategory(Level::ERROR)); LoggerRepositoryPtr h = new Hierarchy(root); - LoggerPtr a0 = h->getLogger(LOG4CXX_STR("a")); + LoggerPtr a0 = h->getLogger(LOG4CXX_STR("a"), h); CPPUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("a"), a0->getName()); CPPUNIT_ASSERT(a0->getLevel() == 0); CPPUNIT_ASSERT(Level::ERROR == a0->getEffectiveLevel()); - LoggerPtr a1 = h->getLogger(LOG4CXX_STR("a")); + LoggerPtr a1 = h->getLogger(LOG4CXX_STR("a"), h); CPPUNIT_ASSERT_EQUAL(a0, a1); } -- Mihai RUSU Email: [EMAIL PROTECTED] GPG : http://dizzy.roedu.net/dizzy-gpg.txt WWW: http://dizzy.roedu.net "Linux is obsolete" -- AST