Re: Singleton class fails on reboot
keepyourstupidspam@yahoo.co.uk wrote:
Hi,
I am writing a windows service. The code runs fine when I start the
service when my machine is running but
it fails to start automatically when the machine reboots. The code
bombs out when it reaches code that tries to access
a singleton class. This is the code.
void ClientLogging::initClientErrorLog(InstallationInfo install)
{
// next line fails on a reboot
string szLogLevel =
ConfigManager::Instance().getConfigMgrValue("LOG_LEVEL");
Logging::Instance().Initialize("IseeCltLog");
Logging::LogLevel severity =
Logging::Instance().toSeverity(szLogLevel);
m_pFileLogAppender = new FileLogAppender(severity, logFile); //this
line fails on reboot
if(false == Logging::Instance().addAppender(m_pFileLogAppender))
{
}
}
The strange thing is ClientLogging is also a singleton, the first one
that is called, and this works fine.
This is called using:
ClientLogging::Instance().initClientErrorLog(install);
But it is inside this that the problems arise, on the line as seen
above
string szLogLevel =
ConfigManager::Instance().getConfigMgrValue("LOG_LEVEL");
The code just terminates.
Is there anything I can do to prevent this, any pragma.
Could this be because I initialize static variables.
Your help would be greatly appreciated.
Your singletons should be created inside a static member function as a
local static variable.
That's the only way to garantee, that your singleton will be created in
a just-in-time order.
If you create your singleton as a global variable or a static member
variable, there's no way to garantee it will be initialized when it's
first used by another global object (like another singleton).
Example:
foo& foo::Instance() //Where Instance is declared as a static method
{
static foo my_foo;
return my_foo;
}