You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by ca...@apache.org on 2007/10/27 05:52:55 UTC

svn commit: r589047 - in /logging/log4cxx/trunk/src/main: cpp/ include/log4cxx/ include/log4cxx/helpers/ include/log4cxx/xml/

Author: carnold
Date: Fri Oct 26 20:52:55 2007
New Revision: 589047

URL: http://svn.apache.org/viewvc?rev=589047&view=rev
Log:
LOGCXX-145: Memory usage grows when repeatedly using DOMConfigurator::configure

Modified:
    logging/log4cxx/trunk/src/main/cpp/appenderattachableimpl.cpp
    logging/log4cxx/trunk/src/main/cpp/asyncappender.cpp
    logging/log4cxx/trunk/src/main/cpp/domconfigurator.cpp
    logging/log4cxx/trunk/src/main/cpp/logger.cpp
    logging/log4cxx/trunk/src/main/cpp/writerappender.cpp
    logging/log4cxx/trunk/src/main/include/log4cxx/helpers/appenderattachableimpl.h
    logging/log4cxx/trunk/src/main/include/log4cxx/logger.h
    logging/log4cxx/trunk/src/main/include/log4cxx/xml/domconfigurator.h

Modified: logging/log4cxx/trunk/src/main/cpp/appenderattachableimpl.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/appenderattachableimpl.cpp?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/appenderattachableimpl.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/appenderattachableimpl.cpp Fri Oct 26 20:52:55 2007
@@ -29,9 +29,8 @@
 IMPLEMENT_LOG4CXX_OBJECT(AppenderAttachableImpl)
 
 
-AppenderAttachableImpl::AppenderAttachableImpl()
+AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool)
    : appenderList(),
-     pool(), 
      mutex(pool) {
 }
 

Modified: logging/log4cxx/trunk/src/main/cpp/asyncappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/asyncappender.cpp?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/asyncappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/asyncappender.cpp Fri Oct 26 20:52:55 2007
@@ -48,7 +48,7 @@
   bufferNotEmpty(pool),
   discardMap(),
   bufferSize(DEFAULT_BUFFER_SIZE),
-  appenders(new AppenderAttachableImpl()),
+  appenders(new AppenderAttachableImpl(pool)),
   dispatcher(),
   locationInfo(false),
   blocking(true) {

Modified: logging/log4cxx/trunk/src/main/cpp/domconfigurator.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/domconfigurator.cpp?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/domconfigurator.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/domconfigurator.cpp Fri Oct 26 20:52:55 2007
@@ -111,22 +111,24 @@
 /**
 Used internally to parse appenders by IDREF name.
 */
-AppenderPtr DOMConfigurator::findAppenderByName(apr_xml_elem* element,
+AppenderPtr DOMConfigurator::findAppenderByName(log4cxx::helpers::Pool& p,
+                                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                                apr_xml_elem* element,
                                                 apr_xml_doc* doc,
                                                 const LogString& appenderName,
                                                 AppenderMap& appenders) {
     AppenderPtr appender;
     std::string tagName(element->name);
     if (tagName == APPENDER_TAG) {
-        if (appenderName == getAttribute(element, NAME_ATTR)) {
-              appender = parseAppender(element, doc, appenders);
+        if (appenderName == getAttribute(utf8Decoder, element, NAME_ATTR)) {
+              appender = parseAppender(p, utf8Decoder, element, doc, appenders);
         }
     }
     if (element->first_child && !appender) {
-         appender = findAppenderByName(element->first_child, doc, appenderName, appenders);
+         appender = findAppenderByName(p, utf8Decoder, element->first_child, doc, appenderName, appenders);
     }
     if (element->next && !appender) {
-        appender = findAppenderByName(element->next, doc, appenderName, appenders);
+        appender = findAppenderByName(p, utf8Decoder, element->next, doc, appenderName, appenders);
     }
     return appender;
 }
@@ -134,17 +136,20 @@
 /**
  Used internally to parse appenders by IDREF element.
 */
-AppenderPtr DOMConfigurator::findAppenderByReference(apr_xml_elem* appenderRef,
+AppenderPtr DOMConfigurator::findAppenderByReference(
+                                                     log4cxx::helpers::Pool& p,
+                                                     log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                                     apr_xml_elem* appenderRef,
                                                      apr_xml_doc* doc,
                                                      AppenderMap& appenders)
 {
-        LogString appenderName(subst(getAttribute(appenderRef, REF_ATTR)));
+        LogString appenderName(subst(getAttribute(utf8Decoder, appenderRef, REF_ATTR)));
         AppenderMap::const_iterator match = appenders.find(appenderName);
         AppenderPtr appender;
         if (match != appenders.end()) {
             appender = match->second;
         } else if (doc) {
-            appender = findAppenderByName(doc->root, doc, appenderName, appenders);
+            appender = findAppenderByName(p, utf8Decoder, doc->root, doc, appenderName, appenders);
             if (appender) {
                 appenders.insert(AppenderMap::value_type(appenderName, appender));
             }
@@ -159,12 +164,14 @@
 /**
 Used internally to parse an appender element.
 */
-AppenderPtr DOMConfigurator::parseAppender(apr_xml_elem* appenderElement,
+AppenderPtr DOMConfigurator::parseAppender(Pool& p,
+                                           log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                           apr_xml_elem* appenderElement,
                                            apr_xml_doc* doc,
                                            AppenderMap& appenders)
 {
 
-    LogString className(subst(getAttribute(appenderElement, CLASS_ATTR)));
+    LogString className(subst(getAttribute(utf8Decoder, appenderElement, CLASS_ATTR)));
     LogLog::debug(LOG4CXX_STR("Class name: [") + className+LOG4CXX_STR("]"));
     try
         {
@@ -172,7 +179,7 @@
                 AppenderPtr appender = instance;
                 PropertySetter propSetter(appender);
 
-                appender->setName(subst(getAttribute(appenderElement, NAME_ATTR)));
+                appender->setName(subst(getAttribute(utf8Decoder, appenderElement, NAME_ATTR)));
 
                 for(apr_xml_elem* currentElement = appenderElement->first_child;
                      currentElement;
@@ -183,18 +190,18 @@
                                 // Parse appender parameters
                                 if (tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                                 }
                                 // Set appender layout
                                 else if (tagName == LAYOUT_TAG)
                                 {
-                                        appender->setLayout(parseLayout(currentElement));
+                                        appender->setLayout(parseLayout(p, utf8Decoder, currentElement));
                                 }
                                 // Add filters
                                 else if (tagName == FILTER_TAG)
                                 {
                                         std::vector<log4cxx::spi::FilterPtr> filters;
-                                        parseFilters(currentElement, filters);
+                                        parseFilters(p, utf8Decoder, currentElement, filters);
                                         for(std::vector<log4cxx::spi::FilterPtr>::iterator iter = filters.begin();
                                             iter != filters.end();
                                             iter++) {
@@ -203,11 +210,11 @@
                                 }
                                 else if (tagName == ERROR_HANDLER_TAG)
                                 {
-                                        parseErrorHandler(currentElement, appender, doc, appenders);
+                                        parseErrorHandler(p, utf8Decoder, currentElement, appender, doc, appenders);
                                 }
                                 else if (tagName == ROLLING_POLICY_TAG)
                                 {
-                                        RollingPolicyPtr rollPolicy(parseRollingPolicy(currentElement));
+                                        RollingPolicyPtr rollPolicy(parseRollingPolicy(p, utf8Decoder, currentElement));
                                         RollingFileAppenderPtr rfa(appender);
                                         if (rfa != NULL) {
                                            rfa->setRollingPolicy(rollPolicy);
@@ -215,7 +222,7 @@
                                 }
                                 else if (tagName == TRIGGERING_POLICY_TAG)
                                 {
-                                        TriggeringPolicyPtr triggerPolicy(parseTriggeringPolicy(currentElement));
+                                        TriggeringPolicyPtr triggerPolicy(parseTriggeringPolicy(p, utf8Decoder, currentElement));
                                         RollingFileAppenderPtr rfa(appender);
                                         if (rfa != NULL) {
                                            rfa->setTriggeringPolicy(triggerPolicy);
@@ -223,14 +230,14 @@
                                 }
                                 else if (tagName == APPENDER_REF_TAG)
                                 {
-                                        LogString refName = subst(getAttribute(currentElement, REF_ATTR));
+                                        LogString refName = subst(getAttribute(utf8Decoder, currentElement, REF_ATTR));
                                         if(appender->instanceof(AppenderAttachable::getStaticClass()))
                                         {
-                                                AppenderAttachablePtr aa = appender;
+                                                AppenderAttachablePtr aa(appender);
                                                 LogLog::debug(LOG4CXX_STR("Attaching appender named [")+
                                                         refName+LOG4CXX_STR("] to appender named [")+
                                                         appender->getName()+LOG4CXX_STR("]."));
-                                                aa->addAppender(findAppenderByReference(currentElement, doc, appenders));
+                                                aa->addAppender(findAppenderByReference(p, utf8Decoder, currentElement, doc, appenders));
                                         }
                                         else
                                         {
@@ -240,7 +247,6 @@
                                         }
                                 }
                 }
-                Pool p;
                 propSetter.activate(p);
                 return appender;
     }
@@ -257,13 +263,15 @@
 /**
 Used internally to parse an {@link ErrorHandler} element.
 */
-void DOMConfigurator::parseErrorHandler(apr_xml_elem* element, 
+void DOMConfigurator::parseErrorHandler(Pool& p,
+                                        log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                        apr_xml_elem* element, 
                                         AppenderPtr& appender,
                                         apr_xml_doc* doc,
                                         AppenderMap& appenders)
 {
     ErrorHandlerPtr eh = OptionConverter::instantiateByClassName(
-                subst(getAttribute(element, CLASS_ATTR)),
+                subst(getAttribute(utf8Decoder, element, CLASS_ATTR)),
                 ErrorHandler::getStaticClass(),
                 0);
 
@@ -279,15 +287,15 @@
                                 std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                                 }
                                 else if(tagName == APPENDER_REF_TAG)
                                 {
-                                        eh->setBackupAppender(findAppenderByReference(currentElement, doc, appenders));
+                                        eh->setBackupAppender(findAppenderByReference(p, utf8Decoder, currentElement, doc, appenders));
                                 }
                                 else if(tagName == LOGGER_REF)
                                 {
-                                        LogString loggerName(getAttribute(currentElement, REF_ATTR));
+                                        LogString loggerName(getAttribute(utf8Decoder, currentElement, REF_ATTR));
                                         LoggerPtr logger = repository->getLogger(loggerName, loggerFactory);
                                         eh->setLogger(logger);
                                 }
@@ -297,7 +305,6 @@
                                         eh->setLogger(root);
                                 }
                 }
-                Pool p;
                 propSetter.activate(p);
 //                appender->setErrorHandler(eh);
     }
@@ -306,9 +313,12 @@
 /**
  Used internally to parse a filter element.
 */
-void DOMConfigurator::parseFilters(apr_xml_elem* element, std::vector<log4cxx::spi::FilterPtr>& filters)
+void DOMConfigurator::parseFilters(Pool& p,                                 
+                                   log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                   apr_xml_elem* element, 
+                                   std::vector<log4cxx::spi::FilterPtr>& filters)
 {
-        LogString clazz = subst(getAttribute(element, CLASS_ATTR));
+        LogString clazz = subst(getAttribute(utf8Decoder, element, CLASS_ATTR));
         FilterPtr filter = OptionConverter::instantiateByClassName(clazz,
                 Filter::getStaticClass(), 0);
 
@@ -323,10 +333,9 @@
                                 std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                                 }
                 }
-                Pool p;
                 propSetter.activate(p);
                 filters.push_back(filter);
         }
@@ -335,12 +344,15 @@
 /**
 Used internally to parse an category or logger element.
 */
-void DOMConfigurator::parseLogger(apr_xml_elem* loggerElement, 
+void DOMConfigurator::parseLogger(
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* loggerElement, 
                                   apr_xml_doc* doc,
                                   AppenderMap& appenders)
 {
         // Create a new Logger object from the <category> element.
-        LogString loggerName = subst(getAttribute(loggerElement, NAME_ATTR));
+        LogString loggerName = subst(getAttribute(utf8Decoder, loggerElement, NAME_ATTR));
 
         LogLog::debug(LOG4CXX_STR("Retreiving an instance of Logger."));
         LoggerPtr logger = repository->getLogger(loggerName, loggerFactory);
@@ -350,21 +362,24 @@
         // configuration is in progress.
         synchronized sync(logger->getMutex());
         bool additivity = OptionConverter::toBoolean(
-                subst(getAttribute(loggerElement, ADDITIVITY_ATTR)),
+                subst(getAttribute(utf8Decoder, loggerElement, ADDITIVITY_ATTR)),
                 true);
 
         LogLog::debug(LOG4CXX_STR("Setting [")+logger->getName()+LOG4CXX_STR("] additivity to [")+
                 (additivity ? LogString(LOG4CXX_STR("true")) : LogString(LOG4CXX_STR("false")))+LOG4CXX_STR("]."));
         logger->setAdditivity(additivity);
-        parseChildrenOfLoggerElement(loggerElement, logger, false, doc, appenders);
+        parseChildrenOfLoggerElement(p, utf8Decoder, loggerElement, logger, false, doc, appenders);
 }
 
 /**
  Used internally to parse the logger factory element.
 */
-void DOMConfigurator::parseLoggerFactory(apr_xml_elem* factoryElement)
+void DOMConfigurator::parseLoggerFactory(
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                   apr_xml_elem* factoryElement)
 {
-        LogString className(subst(getAttribute(factoryElement, CLASS_ATTR)));
+        LogString className(subst(getAttribute(utf8Decoder, factoryElement, CLASS_ATTR)));
 
         if(className.empty())
         {
@@ -385,7 +400,7 @@
                      currentElement = currentElement->next) {
                      std::string tagName(currentElement->name);
                      if (tagName == PARAM_TAG) {
-                            setParameter(currentElement, propSetter);
+                            setParameter(p, utf8Decoder, currentElement, propSetter);
                     }
                 }
         }
@@ -394,20 +409,28 @@
 /**
  Used internally to parse the root logger element.
 */
-void DOMConfigurator::parseRoot(apr_xml_elem* rootElement, apr_xml_doc* doc, AppenderMap& appenders)
+void DOMConfigurator::parseRoot(
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* rootElement, 
+                                  apr_xml_doc* doc, 
+                                  AppenderMap& appenders)
 {
         LoggerPtr root = repository->getRootLogger();
         // logger configuration needs to be atomic
         synchronized sync(root->getMutex());
-        parseChildrenOfLoggerElement(rootElement, root, true, doc, appenders);
+        parseChildrenOfLoggerElement(p, utf8Decoder, rootElement, root, true, doc, appenders);
 }
 
 /**
  Used internally to parse the children of a logger element.
 */
 void DOMConfigurator::parseChildrenOfLoggerElement(
-        apr_xml_elem* loggerElement, LoggerPtr logger, bool isRoot,
-        apr_xml_doc* doc, AppenderMap& appenders)
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* loggerElement, LoggerPtr logger, bool isRoot,
+                                  apr_xml_doc* doc, 
+                                  AppenderMap& appenders)
 {
 
     PropertySetter propSetter(logger);
@@ -424,8 +447,8 @@
 
                         if (tagName == APPENDER_REF_TAG)
                         {
-                                AppenderPtr appender = findAppenderByReference(currentElement, doc, appenders);
-                                LogString refName =  subst(getAttribute(currentElement, REF_ATTR));
+                                AppenderPtr appender = findAppenderByReference(p, utf8Decoder, currentElement, doc, appenders);
+                                LogString refName =  subst(getAttribute(utf8Decoder, currentElement, REF_ATTR));
                                 if(appender != 0)
                                 {
                                         LogLog::debug(LOG4CXX_STR("Adding appender named [")+ refName+
@@ -442,27 +465,29 @@
                         }
                         else if(tagName == LEVEL_TAG)
                         {
-                                parseLevel(currentElement, logger, isRoot);
+                                parseLevel(p, utf8Decoder, currentElement, logger, isRoot);
                         }
                         else if(tagName == PRIORITY_TAG)
                         {
-                                parseLevel(currentElement, logger, isRoot);
+                                parseLevel(p, utf8Decoder, currentElement, logger, isRoot);
                         }
                         else if(tagName == PARAM_TAG)
                         {
-                                setParameter(currentElement, propSetter);
+                                setParameter(p, utf8Decoder, currentElement, propSetter);
                         }
     }
-    Pool p;
     propSetter.activate(p);
 }
 
 /**
  Used internally to parse a layout element.
 */
-LayoutPtr DOMConfigurator::parseLayout (apr_xml_elem* layout_element)
+LayoutPtr DOMConfigurator::parseLayout (
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* layout_element)
 {
-        LogString className(subst(getAttribute(layout_element, CLASS_ATTR)));
+        LogString className(subst(getAttribute(utf8Decoder, layout_element, CLASS_ATTR)));
         LogLog::debug(LOG4CXX_STR("Parsing layout of class: \"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -476,11 +501,10 @@
                                 std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                                 }
                 }
 
-                Pool p;
                 propSetter.activate(p);
                 return layout;
         }
@@ -495,9 +519,12 @@
 /**
  Used internally to parse a triggering policy
 */
-TriggeringPolicyPtr DOMConfigurator::parseTriggeringPolicy (apr_xml_elem* layout_element)
+TriggeringPolicyPtr DOMConfigurator::parseTriggeringPolicy (
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* layout_element)
 {
-        LogString className = subst(getAttribute(layout_element, CLASS_ATTR));
+        LogString className = subst(getAttribute(utf8Decoder, layout_element, CLASS_ATTR));
         LogLog::debug(LOG4CXX_STR("Parsing triggering policy of class: \"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -511,11 +538,11 @@
                                 std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                                 }
                                 else if (tagName == FILTER_TAG) {
                                   std::vector<log4cxx::spi::FilterPtr> filters;
-                                  parseFilters(currentElement, filters);
+                                  parseFilters(p, utf8Decoder, currentElement, filters);
                                   FilterBasedTriggeringPolicyPtr fbtp(instance);
                                   if (fbtp != NULL) {
                                     for(std::vector<log4cxx::spi::FilterPtr>::iterator iter = filters.begin();
@@ -527,7 +554,6 @@
                                 }
                 }
 
-                Pool p;
                 propSetter.activate(p);
                 return layout;
         }
@@ -542,9 +568,12 @@
 /**
  Used internally to parse a triggering policy
 */
-RollingPolicyPtr DOMConfigurator::parseRollingPolicy (apr_xml_elem* layout_element)
+RollingPolicyPtr DOMConfigurator::parseRollingPolicy (
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* layout_element)
 {
-        LogString className = subst(getAttribute(layout_element, CLASS_ATTR));
+        LogString className = subst(getAttribute(utf8Decoder, layout_element, CLASS_ATTR));
         LogLog::debug(LOG4CXX_STR("Parsing rolling policy of class: \"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -558,11 +587,10 @@
                                 std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
-                                        setParameter(currentElement, propSetter);
+                                        setParameter(p, utf8Decoder, currentElement, propSetter);
                         }
                 }
 
-                Pool p;
                 propSetter.activate(p);
                 return layout;
         }
@@ -579,7 +607,10 @@
 /**
  Used internally to parse a level  element.
 */
-void DOMConfigurator::parseLevel(apr_xml_elem* element, LoggerPtr logger, bool isRoot)
+void DOMConfigurator::parseLevel(
+                                  log4cxx::helpers::Pool& p,
+                                  log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,                                  
+                                  apr_xml_elem* element, LoggerPtr logger, bool isRoot)
 {
     LogString loggerName = logger->getName();
     if(isRoot)
@@ -587,7 +618,7 @@
                 loggerName = LOG4CXX_STR("root");
     }
 
-    LogString levelStr(subst(getAttribute(element, VALUE_ATTR)));
+    LogString levelStr(subst(getAttribute(utf8Decoder, element, VALUE_ATTR)));
         LogLog::debug(LOG4CXX_STR("Level value for ")+loggerName+LOG4CXX_STR(" is [")+levelStr+LOG4CXX_STR("]."));
 
     if (StringHelper::equalsIgnoreCase(levelStr,LOG4CXX_STR("INHERITED"), LOG4CXX_STR("inherited"))
@@ -604,7 +635,7 @@
     }
         else
         {
-                LogString className(subst(getAttribute(element, CLASS_ATTR)));
+                LogString className(subst(getAttribute(utf8Decoder, element, CLASS_ATTR)));
 
                 if (className.empty())
                 {
@@ -644,11 +675,13 @@
                 logger->getEffectiveLevel()->toString());
 }
 
-void DOMConfigurator::setParameter(apr_xml_elem* elem, PropertySetter& propSetter)
+void DOMConfigurator::setParameter(log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                apr_xml_elem* elem, 
+                                PropertySetter& propSetter)
 {
-        LogString name(subst(getAttribute(elem, NAME_ATTR)));
-        LogString value(subst(getAttribute(elem, VALUE_ATTR)));
-        Pool p;
+        LogString name(subst(getAttribute(utf8Decoder, elem, NAME_ATTR)));
+        LogString value(subst(getAttribute(utf8Decoder, elem, VALUE_ATTR)));
         value = subst(value);
         propSetter.setProperty(name, value, p);
 }
@@ -692,7 +725,8 @@
                 LogLog::error(msg2);
             } else {
                 AppenderMap appenders;
-                parse(doc->root, doc, appenders);
+                CharsetDecoderPtr utf8Decoder(CharsetDecoder::getUTF8Decoder());
+                parse(p, utf8Decoder, doc->root, doc, appenders);
             }
         }
 }
@@ -742,7 +776,10 @@
 }
 #endif
 
-void DOMConfigurator::parse(apr_xml_elem* element,
+void DOMConfigurator::parse(
+                            Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* element,
                             apr_xml_doc* doc,
                             AppenderMap& appenders)
 {
@@ -764,7 +801,7 @@
                 }
     }
 
-    LogString debugAttrib = subst(getAttribute(element, INTERNAL_DEBUG_ATTR));
+    LogString debugAttrib = subst(getAttribute(utf8Decoder, element, INTERNAL_DEBUG_ATTR));
 
     static const LogString NuLL(LOG4CXX_STR("NULL"));
     LogLog::debug(LOG4CXX_STR("debug attribute= \"") + debugAttrib +LOG4CXX_STR("\"."));
@@ -780,7 +817,7 @@
     }
 
 
-    LogString confDebug = subst(getAttribute(element, CONFIG_DEBUG_ATTR));
+    LogString confDebug = subst(getAttribute(utf8Decoder, element, CONFIG_DEBUG_ATTR));
     if(!confDebug.empty() && confDebug != NuLL)
         {
                 LogLog::warn(LOG4CXX_STR("The \"configDebug\" attribute is deprecated."));
@@ -788,7 +825,7 @@
                 LogLog::setInternalDebugging(OptionConverter::toBoolean(confDebug, true));
     }
 
-    LogString thresholdStr = subst(getAttribute(element, THRESHOLD_ATTR));
+    LogString thresholdStr = subst(getAttribute(utf8Decoder, element, THRESHOLD_ATTR));
     LogLog::debug(LOG4CXX_STR("Threshold =\"") + thresholdStr +LOG4CXX_STR("\"."));
     if(!thresholdStr.empty() && thresholdStr != NuLL)
         {
@@ -803,7 +840,7 @@
 
                         if (tagName == CATEGORY_FACTORY_TAG)
                         {
-                                parseLoggerFactory(currentElement);
+                                parseLoggerFactory(p, utf8Decoder, currentElement);
                         }
     }
 
@@ -814,11 +851,11 @@
 
                         if (tagName == CATEGORY || tagName == LOGGER)
                         {
-                                parseLogger(currentElement, doc, appenders);
+                                parseLogger(p, utf8Decoder, currentElement, doc, appenders);
                         }
                         else if (tagName == ROOT_TAG)
                         {
-                                parseRoot(currentElement, doc, appenders);
+                                parseRoot(p, utf8Decoder, currentElement, doc, appenders);
                         }
     }
 }
@@ -837,7 +874,9 @@
 }
 
 
-LogString DOMConfigurator::getAttribute(apr_xml_elem* element, 
+LogString DOMConfigurator::getAttribute(
+                                        log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                        apr_xml_elem* element, 
                                         const std::string& attrName) {
     LogString attrValue;
     for(apr_xml_attr* attr = element->attr;
@@ -845,7 +884,7 @@
         attr = attr->next) {
         if (attrName == attr->name) {
             ByteBuffer buf((char*) attr->value, strlen(attr->value));
-            CharsetDecoder::getUTF8Decoder()->decode(buf, attrValue);
+            utf8Decoder->decode(buf, attrValue);
         }
     }
     return attrValue;

Modified: logging/log4cxx/trunk/src/main/cpp/logger.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/logger.cpp?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/logger.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/logger.cpp Fri Oct 26 20:52:55 2007
@@ -38,9 +38,9 @@
 
 IMPLEMENT_LOG4CXX_OBJECT(Logger)
 
-Logger::Logger(Pool& pool, const LogString& name1)
-: name(), level(), parent(), resourceBundle(),
-repository(), aai(), mutex(pool)
+Logger::Logger(Pool& p, const LogString& name1)
+: pool(&p), name(), level(), parent(), resourceBundle(),
+repository(), aai(), mutex(p)
 {
     synchronized sync(mutex);
     name = name1;
@@ -60,7 +60,7 @@
 
         if (aai == 0)
         {
-                  aai = new AppenderAttachableImpl();
+                  aai = new AppenderAttachableImpl(*pool);
         }
         aai->addAppender(newAppender);
 	if (repository != 0) {

Modified: logging/log4cxx/trunk/src/main/cpp/writerappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/writerappender.cpp?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/writerappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/writerappender.cpp Fri Oct 26 20:52:55 2007
@@ -150,9 +150,12 @@
   if (writer != NULL) {
     try {
       // before closing we have to output out layout's footer
-      Pool p;
-      writeFooter(p);
-      writer->close(p);
+      //
+      //   Using the object's pool since this is a one-shot operation
+      //    and pool is likely to be reclaimed soon when appender is destructed.
+      //
+      writeFooter(pool);
+      writer->close(pool);
       writer = 0;
     } catch (IOException& e) {
       LogLog::error(LogString(LOG4CXX_STR("Could not close writer for WriterAppener named "))+name, e);

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/appenderattachableimpl.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/appenderattachableimpl.h?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/appenderattachableimpl.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/appenderattachableimpl.h Fri Oct 26 20:52:55 2007
@@ -45,10 +45,14 @@
             /** Array of appenders. */
             AppenderList  appenderList;
 
-        public:
-            AppenderAttachableImpl();
+        public:            
+            /**
+             *   Create new instance.
+             *   @param pool pool, must be longer-lived than instance. 
+             */
+            AppenderAttachableImpl(Pool& pool);
 
-            DECLARE_LOG4CXX_OBJECT(AppenderAttachableImpl)
+            DECLARE_ABSTRACT_LOG4CXX_OBJECT(AppenderAttachableImpl)
             BEGIN_LOG4CXX_CAST_MAP()
                 LOG4CXX_CAST_ENTRY(AppenderAttachableImpl)
                 LOG4CXX_CAST_ENTRY(spi::AppenderAttachable)
@@ -101,7 +105,6 @@
             inline const log4cxx::helpers::Mutex& getMutex() const { return mutex; }
 
         private:
-            log4cxx::helpers::Pool pool;
             log4cxx::helpers::Mutex mutex;
             AppenderAttachableImpl(const AppenderAttachableImpl&);
             AppenderAttachableImpl& operator=(const AppenderAttachableImpl&);

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/logger.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/logger.h?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/logger.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/logger.h Fri Oct 26 20:52:55 2007
@@ -55,6 +55,12 @@
                 LOG4CXX_CAST_ENTRY(Logger)
                 LOG4CXX_CAST_ENTRY(spi::AppenderAttachable)
         END_LOG4CXX_CAST_MAP()
+        
+    private:
+        /**
+         *   Reference to memory pool.
+         */
+        helpers::Pool* pool;
 
     protected:
         /**

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/xml/domconfigurator.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/xml/domconfigurator.h?rev=589047&r1=589046&r2=589047&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/xml/domconfigurator.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/xml/domconfigurator.h Fri Oct 26 20:52:55 2007
@@ -34,6 +34,11 @@
 namespace log4cxx
 {
         class File;
+        
+        namespace helpers {
+                class CharsetDecoder;
+                typedef helpers::ObjectPtrT<CharsetDecoder> CharsetDecoderPtr;
+        }
 
         namespace spi
         {
@@ -94,7 +99,10 @@
                         /**
                         Used internally to parse appenders by IDREF name.
                         */
-                        AppenderPtr findAppenderByName(apr_xml_elem* elem,
+                        AppenderPtr findAppenderByName(
+                                log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                apr_xml_elem* elem,
                                 apr_xml_doc* doc,
                                 const LogString& appenderName,
                                 AppenderMap& appenders);
@@ -103,6 +111,8 @@
                         Used internally to parse appenders by IDREF element.
                         */
                         AppenderPtr findAppenderByReference(
+                                log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
                                 apr_xml_elem* appenderRef,
                                 apr_xml_doc* doc,
                                 AppenderMap& appenders);
@@ -110,14 +120,20 @@
                         /**
                         Used internally to parse an appender element.
                         */
-                        AppenderPtr parseAppender(apr_xml_elem* appenderElement,
+                        AppenderPtr parseAppender(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* appenderElement,
                             apr_xml_doc* doc,
                             AppenderMap& appenders);
 
                         /**
                         Used internally to parse an {@link spi::ErrorHandler ErrorHandler } element.
                         */
-                        void parseErrorHandler(apr_xml_elem*, 
+                        void parseErrorHandler(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* element, 
                             AppenderPtr& appender,
                             apr_xml_doc* doc,
                             AppenderMap& appenders);
@@ -125,42 +141,59 @@
                         /**
                          Used internally to parse a filter element.
                         */
-                        void parseFilters(apr_xml_elem* element,
+                        void parseFilters(
+                           log4cxx::helpers::Pool& p,
+                           log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                           apr_xml_elem* element,
                            std::vector<log4cxx::spi::FilterPtr>& filters);
 
                         /**
                         Used internally to parse a logger element.
                         */
-                        void parseLogger(apr_xml_elem* loggerElement,
+                        void parseLogger(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* loggerElement,
                             apr_xml_doc* doc,
                             AppenderMap& appenders);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
-                        void parseLoggerFactory(apr_xml_elem* factoryElement);
+                        void parseLoggerFactory(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
                         log4cxx::rolling::TriggeringPolicyPtr parseTriggeringPolicy(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
                             apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
                         log4cxx::rolling::RollingPolicyPtr parseRollingPolicy(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
                             apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the root logger element.
                         */
-                        void parseRoot(apr_xml_elem* rootElement, apr_xml_doc* doc, AppenderMap& appenders);
+                        void parseRoot(log4cxx::helpers::Pool& p, 
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* rootElement, apr_xml_doc* doc, AppenderMap& appenders);
 
                         /**
                          Used internally to parse the children of a logger element.
                         */
                         void parseChildrenOfLoggerElement(
+                                log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
                                 apr_xml_elem* catElement,
                                 LoggerPtr logger, bool isRoot,
                                 apr_xml_doc* doc,
@@ -169,22 +202,34 @@
                         /**
                          Used internally to parse a layout element.
                         */
-                        LayoutPtr parseLayout(apr_xml_elem* layout_element);
+                        LayoutPtr parseLayout(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* layout_element);
 
                         /**
                          Used internally to parse a level  element.
                         */
-                        void parseLevel(apr_xml_elem* element,
+                        void parseLevel(
+                                log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                apr_xml_elem* element,
                                 LoggerPtr logger, bool isRoot);
 
-                        void setParameter(apr_xml_elem* elem,
+                        void setParameter(
+                                log4cxx::helpers::Pool& p,
+                                log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                                apr_xml_elem* elem,
                                 config::PropertySetter& propSetter);
 
                         /**
                          Used internally to configure the log4cxx framework from
                          an in-memory representation of an XML document.
                         */
-                        void parse(apr_xml_elem* element, 
+                        void parse(
+                            log4cxx::helpers::Pool& p,
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem* element, 
                             apr_xml_doc* doc,
                             AppenderMap& appenders);
 
@@ -244,7 +289,9 @@
                                 spi::LoggerRepositoryPtr& repository);
 
                 protected:
-                        static LogString getAttribute(apr_xml_elem*, 
+                        static LogString getAttribute(
+                            log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
+                            apr_xml_elem*, 
                             const std::string& attrName);
 
                         LogString subst(const LogString& value);