diff --git a/Modules/Core/Common/include/otbLogger.h b/Modules/Core/Common/include/otbLogger.h index d61c22bf4afd22fa0c560fc7725bbfed5f90ecf5..3e69d173c0a9c75c0451919930fb3068b25b66e2 100644 --- a/Modules/Core/Common/include/otbLogger.h +++ b/Modules/Core/Common/include/otbLogger.h @@ -61,7 +61,7 @@ private: Logger(const Self &); //purposely not implemented void operator =(const Self&); //purposely not implemented - static Pointer Singleton; + static Pointer CreateInstance(); }; // class Logger diff --git a/Modules/Core/Common/src/otbLogger.cxx b/Modules/Core/Common/src/otbLogger.cxx index 37a2ef05404e5ae0622beae3e1686c3189679ae4..b3730cf445a5816ca693da32de7d2a71f3aaba37 100644 --- a/Modules/Core/Common/src/otbLogger.cxx +++ b/Modules/Core/Common/src/otbLogger.cxx @@ -29,25 +29,28 @@ namespace otb { -Logger::Pointer Logger::Singleton = ITK_NULLPTR; - -Logger::Pointer Logger::Instance() +Logger::Pointer Logger::CreateInstance() { - if(!Logger::Singleton) - { - Logger::Singleton = Logger::New(); + Logger::Pointer instance = Logger::New(); - // By default, redirect logs to std::cout - itk::StdStreamLogOutput::Pointer defaultOutput = itk::StdStreamLogOutput::New(); - defaultOutput->SetStream(std::cout); + // By default, redirect logs to std::cout + itk::StdStreamLogOutput::Pointer defaultOutput = itk::StdStreamLogOutput::New(); + defaultOutput->SetStream(std::cout); + + instance->AddLogOutput(defaultOutput); + + // Log setup information + instance->LogSetupInformation(); - Logger::Singleton->AddLogOutput(defaultOutput); + return instance; +} - // Log setup information - Logger::Singleton->LogSetupInformation(); - } - - return Logger::Singleton; +Logger::Pointer Logger::Instance() +{ + // Static locales are initialized once in a thread-safe way + static Logger::Pointer instance = CreateInstance(); + + return instance; } Logger::Logger()