#include <dpl/log/abstract_log_provider.h>
#include <sstream>
#include <list>
+#include <unordered_map>
+#include <string>
#include <noncopyable.h>
#include <symbol-visibility.h>
typedef std::list<AbstractLogProvider *> AbstractLogProviderPtrList;
AbstractLogProviderPtrList m_providers;
AbstractLogProvider::LogLevel m_level;
+
+ typedef AbstractLogProvider*(*ProviderFn)();
+ /*
+ * It cannot be global as it is used in library constructor and we can't be sure which
+ * constructor is called first: library's or new_provider's.
+ */
+ std::unordered_map<std::string, ProviderFn> m_providerCtor;
};
/*
#include <stddef.h>
#include <string.h>
-#include <string>
#include <stdexcept>
-#include <unordered_map>
+
#include <cassert>
#include <dpl/log/log.h>
const char * const CKM_LOG_LEVEL = "CKM_LOG_LEVEL";
const char * const CKM_LOG_PROVIDER = "CKM_LOG_PROVIDER";
-const std::string CONSOLE = "CONSOLE";
-const std::string DLOG = "DLOG";
-const std::string JOURNALD = "JOURNALD";
+const char * const CONSOLE = "CONSOLE";
+const char * const DLOG = "DLOG";
+const char * const JOURNALD = "JOURNALD";
+} // namespace anonymous
-typedef AbstractLogProvider*(*provider_fn)();
-std::unordered_map<std::string, provider_fn> new_provider = {
+LogSystem::LogSystem() : m_providerCtor({
#ifdef BUILD_TYPE_DEBUG
- { CONSOLE, []{ return static_cast<AbstractLogProvider*>(new OldStyleLogProvider()); } },
+ { CONSOLE, []{ return static_cast<AbstractLogProvider*>(new OldStyleLogProvider()); } },
#endif // BUILD_TYPE_DEBUG
- { DLOG, []{ return static_cast<AbstractLogProvider*>(new DLOGLogProvider()); } },
- { JOURNALD, []{ return static_cast<AbstractLogProvider*>(new JournalLogProvider()); } }
-};
-
-} // namespace anonymous
-
-LogSystem::LogSystem()
+ { DLOG, []{ return static_cast<AbstractLogProvider*>(new DLOGLogProvider()); } },
+ { JOURNALD, []{ return static_cast<AbstractLogProvider*>(new JournalLogProvider()); } }
+ })
{
SetLogLevel(getenv(CKM_LOG_LEVEL));
AbstractLogProvider* prv = NULL;
try {
- prv = new_provider.at(getenv(CKM_LOG_PROVIDER))();
+ prv = m_providerCtor.at(getenv(CKM_LOG_PROVIDER))();
} catch(const std::exception&) {
- prv = new_provider[DLOG]();
+ prv = m_providerCtor[DLOG]();
}
AddProvider(prv);
}
void LogSystem::SelectProvider(const std::string& name)
{
// let it throw
- provider_fn& prv = new_provider.at(name);
+ ProviderFn& prv = m_providerCtor.at(name);
RemoveProviders();
AddProvider(prv());