Fixed some segfaults
diff --git a/src/main/cpp/defaultconfigurator.cpp b/src/main/cpp/defaultconfigurator.cpp
index b304084..4b64298 100644
--- a/src/main/cpp/defaultconfigurator.cpp
+++ b/src/main/cpp/defaultconfigurator.cpp
@@ -27,7 +27,7 @@
using namespace log4cxx::spi;
using namespace log4cxx::helpers;
-void DefaultConfigurator::configure(LoggerRepository* repository)
+void DefaultConfigurator::configure(LoggerRepositoryPtr repository)
{
repository->setConfigured(true);
const LogString configuratorClassName(getConfiguratorClass());
diff --git a/src/main/cpp/defaultrepositoryselector.cpp b/src/main/cpp/defaultrepositoryselector.cpp
index 247e0e9..238e0ac 100644
--- a/src/main/cpp/defaultrepositoryselector.cpp
+++ b/src/main/cpp/defaultrepositoryselector.cpp
@@ -22,12 +22,12 @@
using namespace log4cxx::helpers;
-DefaultRepositorySelector::DefaultRepositorySelector(const LoggerRepositoryPtr& repository1)
+DefaultRepositorySelector::DefaultRepositorySelector(const LoggerRepositoryPtr repository1)
: repository(repository1)
{
}
-LoggerRepositoryPtr& DefaultRepositorySelector::getLoggerRepository()
+LoggerRepositoryPtr DefaultRepositorySelector::getLoggerRepository()
{
return repository;
}
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 55f7328..481c152 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -766,7 +766,7 @@
propSetter.setProperty(name, value, p);
}
-void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr& repository1)
+void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr repository1)
{
repository1->setConfigured(true);
this->repository = repository1;
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index 9a26809..9e4184e 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -270,8 +270,9 @@
}
if (!currentlyConfigured)
{
+ std::shared_ptr<Hierarchy> nonconstThis = std::const_pointer_cast<Hierarchy>(shared_from_this());
DefaultConfigurator::configure(
- const_cast<Hierarchy*>(this));
+ nonconstThis);
}
return thresholdInt > level;
@@ -319,7 +320,7 @@
for (it = loggers->begin(); it != itEnd; it++)
{
- LoggerPtr& logger = it->second;
+ LoggerPtr logger = it->second;
logger->closeNestedAppenders();
}
@@ -328,7 +329,7 @@
for (it = loggers->begin(); it != itEnd; it++)
{
- LoggerPtr& logger = it->second;
+ LoggerPtr logger = it->second;
logger->removeAllAppenders();
}
}
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index 31aa4a3..c134108 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -102,9 +102,9 @@
{
int writes = 0;
- for (LoggerPtr logger(const_cast<Logger*>(this));
+ for (const Logger* logger = this;
logger != 0;
- logger = logger->parent)
+ logger = logger->parent.get())
{
// Protected against simultaneous call to addAppender, removeAppender,...
std::unique_lock lock(logger->mutex);
@@ -196,7 +196,7 @@
return aai->getAppender(name1);
}
-const LevelPtr& Logger::getEffectiveLevel() const
+const LevelPtr Logger::getEffectiveLevel() const
{
for (const Logger* l = this; l != 0; l = l->parent.get())
{
@@ -219,7 +219,7 @@
ResourceBundlePtr Logger::getResourceBundle() const
{
- for (LoggerPtr l(const_cast<Logger*>(this)); l != 0; l = l->parent)
+ for (const Logger* l = this; l != 0; l = l->parent.get())
{
if (l->resourceBundle != 0)
{
@@ -504,7 +504,7 @@
this->repository = repository1;
}
-void Logger::setLevel(const LevelPtr& level1)
+void Logger::setLevel(const LevelPtr level1)
{
this->level = level1;
}
diff --git a/src/main/cpp/logmanager.cpp b/src/main/cpp/logmanager.cpp
index fc39333..7797900 100644
--- a/src/main/cpp/logmanager.cpp
+++ b/src/main/cpp/logmanager.cpp
@@ -47,17 +47,22 @@
IMPLEMENT_LOG4CXX_OBJECT(DefaultRepositorySelector)
void* LogManager::guard = 0;
+spi::RepositorySelectorPtr LogManager::repositorySelector;
-
-RepositorySelectorPtr& LogManager::getRepositorySelector()
+RepositorySelectorPtr LogManager::getRepositorySelector()
{
//
// call to initialize APR and trigger "start" of logging clock
//
- APRInitializer::initialize();
- static spi::RepositorySelectorPtr selector;
- return selector;
+ APRInitializer::initialize();
+ if (!repositorySelector)
+ {
+ LoggerRepositoryPtr hierarchy(new Hierarchy());
+ RepositorySelectorPtr selector(new DefaultRepositorySelector(hierarchy));
+ repositorySelector = selector;
+ }
+ return repositorySelector;
}
void LogManager::setRepositorySelector(spi::RepositorySelectorPtr selector,
@@ -79,15 +84,8 @@
-LoggerRepositoryPtr& LogManager::getLoggerRepository()
+LoggerRepositoryPtr LogManager::getLoggerRepository()
{
- if (getRepositorySelector() == 0)
- {
- LoggerRepositoryPtr hierarchy(new Hierarchy());
- RepositorySelectorPtr selector(new DefaultRepositorySelector(hierarchy));
- getRepositorySelector() = selector;
- }
-
return getRepositorySelector()->getLoggerRepository();
}
@@ -209,6 +207,7 @@
void LogManager::shutdown()
{
+ LoggerRepositoryPtr repPtr = getLoggerRepository();
getLoggerRepository()->shutdown();
}
diff --git a/src/main/cpp/optionconverter.cpp b/src/main/cpp/optionconverter.cpp
index f80231f..5791c0b 100644
--- a/src/main/cpp/optionconverter.cpp
+++ b/src/main/cpp/optionconverter.cpp
@@ -375,7 +375,7 @@
}
void OptionConverter::selectAndConfigure(const File& configFileName,
- const LogString& _clazz, spi::LoggerRepositoryPtr& hierarchy)
+ const LogString& _clazz, spi::LoggerRepositoryPtr hierarchy)
{
ConfiguratorPtr configurator;
LogString clazz = _clazz;
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index da1a911..615d33a 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -87,7 +87,7 @@
}
void PropertyConfigurator::doConfigure(const File& configFileName,
- spi::LoggerRepositoryPtr& hierarchy)
+ spi::LoggerRepositoryPtr hierarchy)
{
hierarchy->setConfigured(true);
@@ -151,7 +151,7 @@
#endif
void PropertyConfigurator::doConfigure(helpers::Properties& properties,
- spi::LoggerRepositoryPtr& hierarchy)
+ spi::LoggerRepositoryPtr hierarchy)
{
hierarchy->setConfigured(true);
diff --git a/src/main/cpp/rootlogger.cpp b/src/main/cpp/rootlogger.cpp
index f733806..9f3357a 100644
--- a/src/main/cpp/rootlogger.cpp
+++ b/src/main/cpp/rootlogger.cpp
@@ -24,18 +24,18 @@
using namespace log4cxx::spi;
using namespace log4cxx::helpers;
-RootLogger::RootLogger(Pool& pool, const LevelPtr& level1) :
+RootLogger::RootLogger(Pool& pool, const LevelPtr level1) :
Logger(pool, LOG4CXX_STR("root"))
{
setLevel(level1);
}
-const LevelPtr& RootLogger::getEffectiveLevel() const
+const LevelPtr RootLogger::getEffectiveLevel() const
{
return level;
}
-void RootLogger::setLevel(const LevelPtr& level1)
+void RootLogger::setLevel(const LevelPtr level1)
{
if (level1 == 0)
{
diff --git a/src/main/include/log4cxx/defaultconfigurator.h b/src/main/include/log4cxx/defaultconfigurator.h
index 362d808..2e563bc 100644
--- a/src/main/include/log4cxx/defaultconfigurator.h
+++ b/src/main/include/log4cxx/defaultconfigurator.h
@@ -42,7 +42,7 @@
Add a ConsoleAppender that uses PatternLayout
using the PatternLayout#TTCC_CONVERSION_PATTERN and
prints to <code>stdout</code> to the root logger.*/
- static void configure(log4cxx::spi::LoggerRepository*);
+ static void configure(log4cxx::spi::LoggerRepositoryPtr repository);
private:
static const LogString getConfigurationFileName();
diff --git a/src/main/include/log4cxx/helpers/optionconverter.h b/src/main/include/log4cxx/helpers/optionconverter.h
index b19a07e..91e316f 100644
--- a/src/main/include/log4cxx/helpers/optionconverter.h
+++ b/src/main/include/log4cxx/helpers/optionconverter.h
@@ -155,7 +155,7 @@
@param hierarchy The Hierarchy to act on.
*/
static void selectAndConfigure(const File& configFileName,
- const LogString& clazz, spi::LoggerRepositoryPtr& hierarchy);
+ const LogString& clazz, spi::LoggerRepositoryPtr hierarchy);
};
} // namespace helpers
} // namespace log4cxx
diff --git a/src/main/include/log4cxx/hierarchy.h b/src/main/include/log4cxx/hierarchy.h
index d23bcf3..a367b77 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -55,7 +55,8 @@
*/
class LOG4CXX_EXPORT Hierarchy :
public virtual spi::LoggerRepository,
- public virtual helpers::Object
+ public virtual helpers::Object,
+ public std::enable_shared_from_this<Hierarchy>
{
private:
log4cxx::helpers::Pool pool;
@@ -66,10 +67,10 @@
spi::HierarchyEventListenerList listeners;
typedef std::map<LogString, LoggerPtr> LoggerMap;
- LoggerMap* loggers;
+ std::unique_ptr<LoggerMap> loggers;
typedef std::map<LogString, ProvisionNode> ProvisionNodeMap;
- ProvisionNodeMap* provisionNodes;
+ std::unique_ptr<ProvisionNodeMap> provisionNodes;
LoggerPtr root;
diff --git a/src/main/include/log4cxx/logger.h b/src/main/include/log4cxx/logger.h
index c46bcea..ec95566 100644
--- a/src/main/include/log4cxx/logger.h
+++ b/src/main/include/log4cxx/logger.h
@@ -618,7 +618,7 @@
@throws RuntimeException if all levels are null in the hierarchy
*/
- virtual const LevelPtr& getEffectiveLevel() const;
+ virtual const LevelPtr getEffectiveLevel() const;
/**
Return the the LoggerRepository where this
@@ -1474,7 +1474,7 @@
<p>As in <pre> logger->setLevel(Level::getDebug()); </pre>
<p>Null values are admitted. */
- virtual void setLevel(const LevelPtr& level);
+ virtual void setLevel(const LevelPtr level);
/**
Set the resource bundle to be used with localized logging methods.
diff --git a/src/main/include/log4cxx/logmanager.h b/src/main/include/log4cxx/logmanager.h
index 3fc3560..40f4614 100644
--- a/src/main/include/log4cxx/logmanager.h
+++ b/src/main/include/log4cxx/logmanager.h
@@ -50,7 +50,8 @@
{
private:
static void* guard;
- static spi::RepositorySelectorPtr& getRepositorySelector();
+ static spi::RepositorySelectorPtr repositorySelector;
+ static spi::RepositorySelectorPtr getRepositorySelector();
public:
/**
@@ -72,7 +73,7 @@
static void setRepositorySelector(spi::RepositorySelectorPtr selector,
void* guard);
- static spi::LoggerRepositoryPtr& getLoggerRepository();
+ static spi::LoggerRepositoryPtr getLoggerRepository();
/**
Retrieve the appropriate root logger.
diff --git a/src/main/include/log4cxx/propertyconfigurator.h b/src/main/include/log4cxx/propertyconfigurator.h
index cc2c078..c9703bd 100644
--- a/src/main/include/log4cxx/propertyconfigurator.h
+++ b/src/main/include/log4cxx/propertyconfigurator.h
@@ -290,7 +290,7 @@
@param hierarchy The hierarchy to operation upon.
*/
void doConfigure(const File& configFileName,
- spi::LoggerRepositoryPtr& hierarchy);
+ spi::LoggerRepositoryPtr hierarchy);
/**
Read configuration options from file <code>configFilename</code>.
@@ -333,7 +333,7 @@
for the expected format.
*/
void doConfigure(helpers::Properties& properties,
- spi::LoggerRepositoryPtr& hierarchy);
+ spi::LoggerRepositoryPtr hierarchy);
// --------------------------------------------------------------------------
// Internal stuff
diff --git a/src/main/include/log4cxx/spi/configurator.h b/src/main/include/log4cxx/spi/configurator.h
index c7a8706..172999d 100644
--- a/src/main/include/log4cxx/spi/configurator.h
+++ b/src/main/include/log4cxx/spi/configurator.h
@@ -45,7 +45,7 @@
@param repository The hierarchy to operation upon.
*/
virtual void doConfigure(const File& configFileName,
- spi::LoggerRepositoryPtr& repository) = 0;
+ spi::LoggerRepositoryPtr repository) = 0;
private:
diff --git a/src/main/include/log4cxx/spi/defaultrepositoryselector.h b/src/main/include/log4cxx/spi/defaultrepositoryselector.h
index bf5a6c9..325a359 100644
--- a/src/main/include/log4cxx/spi/defaultrepositoryselector.h
+++ b/src/main/include/log4cxx/spi/defaultrepositoryselector.h
@@ -36,8 +36,9 @@
LOG4CXX_CAST_ENTRY(RepositorySelector)
END_LOG4CXX_CAST_MAP()
- DefaultRepositorySelector(const LoggerRepositoryPtr& repository1);
- virtual LoggerRepositoryPtr& getLoggerRepository();
+ DefaultRepositorySelector(const LoggerRepositoryPtr repository1);
+ ~DefaultRepositorySelector(){}
+ virtual LoggerRepositoryPtr getLoggerRepository();
private:
LoggerRepositoryPtr repository;
diff --git a/src/main/include/log4cxx/spi/repositoryselector.h b/src/main/include/log4cxx/spi/repositoryselector.h
index cf36f58..af141b7 100644
--- a/src/main/include/log4cxx/spi/repositoryselector.h
+++ b/src/main/include/log4cxx/spi/repositoryselector.h
@@ -44,7 +44,7 @@
public:
DECLARE_ABSTRACT_LOG4CXX_OBJECT(RepositorySelector)
virtual ~RepositorySelector() {}
- virtual LoggerRepositoryPtr& getLoggerRepository() = 0;
+ virtual LoggerRepositoryPtr getLoggerRepository() = 0;
};
LOG4CXX_PTR_DEF(RepositorySelector);
} //namespace spi
diff --git a/src/main/include/log4cxx/spi/rootlogger.h b/src/main/include/log4cxx/spi/rootlogger.h
index f2f3e8c..671dfa9 100644
--- a/src/main/include/log4cxx/spi/rootlogger.h
+++ b/src/main/include/log4cxx/spi/rootlogger.h
@@ -40,19 +40,21 @@
The root logger names itself as "root". However, the root
logger cannot be retrieved by name.
*/
- RootLogger(log4cxx::helpers::Pool& pool, const LevelPtr& level);
+ RootLogger(log4cxx::helpers::Pool& pool, const LevelPtr level);
+
+ ~RootLogger(){}
/**
Return the assigned level value without walking the logger
hierarchy.
*/
- virtual const LevelPtr& getEffectiveLevel() const;
+ virtual const LevelPtr getEffectiveLevel() const;
/**
Setting a null value to the level of the root logger may have catastrophic
results. We prevent this here.
*/
- void setLevel(const LevelPtr& level);
+ void setLevel(const LevelPtr level);
};
} // namespace spi
} // namespace log4cxx
diff --git a/src/main/include/log4cxx/xml/domconfigurator.h b/src/main/include/log4cxx/xml/domconfigurator.h
index fa737ce..fde17fd 100644
--- a/src/main/include/log4cxx/xml/domconfigurator.h
+++ b/src/main/include/log4cxx/xml/domconfigurator.h
@@ -286,7 +286,7 @@
@param repository The hierarchy to operation upon.
*/
void doConfigure(const File& filename,
- spi::LoggerRepositoryPtr& repository);
+ spi::LoggerRepositoryPtr repository);
protected:
static LogString getAttribute(