Fixed levels to initialize statically.
diff --git a/src/main/cpp/level.cpp b/src/main/cpp/level.cpp
index ef388a9..e85cb8b 100644
--- a/src/main/cpp/level.cpp
+++ b/src/main/cpp/level.cpp
@@ -23,51 +23,93 @@
#define LOG4CXX 1
#endif
#include <log4cxx/helpers/aprinitializer.h>
+#include <mutex>
using namespace log4cxx;
using namespace log4cxx::helpers;
IMPLEMENT_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(Level, LevelClass)
+volatile bool Level::initialized = false;
+std::mutex Level::initMutex;
+LevelPtr Level::allLevel;
+LevelPtr Level::fatalLevel;
+LevelPtr Level::errorLevel;
+LevelPtr Level::warnLevel;
+LevelPtr Level::infoLevel;
+LevelPtr Level::debugLevel;
+LevelPtr Level::traceLevel;
+LevelPtr Level::offLevel;
+
+void Level::initializeLevels(){
+ if( initialized ){
+ return;
+ }
+
+ std::unique_lock lock(initMutex);
+ if( initialized ){
+ return;
+ }
+
+ allLevel = LevelPtr(new Level(Level::ALL_INT, LOG4CXX_STR("ALL"), 7));
+ fatalLevel = LevelPtr(new Level(Level::FATAL_INT, LOG4CXX_STR("FATAL"), 0));
+ errorLevel = LevelPtr(new Level(Level::ERROR_INT, LOG4CXX_STR("ERROR"), 3));
+ warnLevel = LevelPtr(new Level(Level::WARN_INT, LOG4CXX_STR("WARN"), 4));
+ infoLevel = LevelPtr(new Level(Level::INFO_INT, LOG4CXX_STR("INFO"), 6));
+ debugLevel = LevelPtr(new Level(Level::DEBUG_INT, LOG4CXX_STR("DEBUG"), 7));
+ traceLevel = LevelPtr(new Level(Level::TRACE_INT, LOG4CXX_STR("TRACE"), 7));
+ offLevel = LevelPtr(new Level(Level::OFF_INT, LOG4CXX_STR("OFF"), 0));
+
+ initialized = true;
+}
+
LevelPtr Level::getOff()
{
- return LevelPtr(new Level(Level::OFF_INT, LOG4CXX_STR("OFF"), 0));
+ initializeLevels();
+ return offLevel;
}
LevelPtr Level::getFatal()
{
- return LevelPtr(new Level(Level::FATAL_INT, LOG4CXX_STR("FATAL"), 0));
+ initializeLevels();
+ return fatalLevel;
}
LevelPtr Level::getError()
{
- return LevelPtr(new Level(Level::ERROR_INT, LOG4CXX_STR("ERROR"), 3));
+ initializeLevels();
+ return errorLevel;
}
LevelPtr Level::getWarn()
{
- return LevelPtr(new Level(Level::WARN_INT, LOG4CXX_STR("WARN"), 4));
+ initializeLevels();
+ return warnLevel;
}
LevelPtr Level::getInfo()
{
- return LevelPtr(new Level(Level::INFO_INT, LOG4CXX_STR("INFO"), 6));
+ initializeLevels();
+ return infoLevel;
}
LevelPtr Level::getDebug()
{
- return LevelPtr(new Level(Level::DEBUG_INT, LOG4CXX_STR("DEBUG"), 7));
+ initializeLevels();
+ return debugLevel;
}
LevelPtr Level::getTrace()
{
- return LevelPtr(new Level(Level::TRACE_INT, LOG4CXX_STR("TRACE"), 7));
+ initializeLevels();
+ return traceLevel;
}
LevelPtr Level::getAll()
{
- return LevelPtr(new Level(Level::ALL_INT, LOG4CXX_STR("ALL"), 7));
+ initializeLevels();
+ return allLevel;
}
@@ -76,7 +118,7 @@
const LogString& name1, int syslogEquivalent1)
: level(level1), name(name1), syslogEquivalent(syslogEquivalent1)
{
- APRInitializer::initialize();
+ APRInitializer::initialize();
}
diff --git a/src/main/include/log4cxx/level.h b/src/main/include/log4cxx/level.h
index 768ec3a..31ee4cd 100644
--- a/src/main/include/log4cxx/level.h
+++ b/src/main/include/log4cxx/level.h
@@ -22,6 +22,7 @@
#include <log4cxx/logstring.h>
#include <limits.h>
#include <log4cxx/helpers/object.h>
+#include <mutex>
#if defined(_MSC_VER)
#pragma warning ( push )
@@ -223,6 +224,7 @@
};
+ static void initializeLevels();
static LevelPtr getAll();
static LevelPtr getFatal();
static LevelPtr getError();
@@ -277,7 +279,18 @@
return level;
}
- private:
+ private:
+ static volatile bool initialized;
+ static std::mutex initMutex;
+ static LevelPtr allLevel;
+ static LevelPtr fatalLevel;
+ static LevelPtr errorLevel;
+ static LevelPtr warnLevel;
+ static LevelPtr infoLevel;
+ static LevelPtr debugLevel;
+ static LevelPtr traceLevel;
+ static LevelPtr offLevel;
+
int level;
LogString name;
int syslogEquivalent;