Fix static initializers for Utility::AddDeferredInitializer

fixes #7646
This commit is contained in:
Gunnar Beutner 2014-11-12 08:00:56 +01:00
parent 83a2e4c350
commit e4bfb5f922
2 changed files with 15 additions and 10 deletions

View File

@ -56,8 +56,6 @@ using namespace icinga;
boost::thread_specific_ptr<String> Utility::m_ThreadName; boost::thread_specific_ptr<String> Utility::m_ThreadName;
boost::thread_specific_ptr<unsigned int> Utility::m_RandSeed; boost::thread_specific_ptr<unsigned int> Utility::m_RandSeed;
boost::thread_specific_ptr<bool> Utility::m_LoadingLibrary;
boost::thread_specific_ptr<std::vector<boost::function<void(void)> > > Utility::m_DeferredInitializers;
/** /**
* Demangles a symbol name. * Demangles a symbol name.
@ -343,23 +341,29 @@ Utility::LoadExtensionLibrary(const String& library)
return hModule; return hModule;
} }
boost::thread_specific_ptr<std::vector<boost::function<void(void)> > >& Utility::GetDeferredInitializers(void)
{
static boost::thread_specific_ptr<std::vector<boost::function<void(void)> > > initializers;
return initializers;
}
void Utility::ExecuteDeferredInitializers(void) void Utility::ExecuteDeferredInitializers(void)
{ {
if (!m_DeferredInitializers.get()) if (!GetDeferredInitializers().get())
return; return;
BOOST_FOREACH(const boost::function<void(void)>& callback, *m_DeferredInitializers.get()) BOOST_FOREACH(const boost::function<void(void)>& callback, *GetDeferredInitializers().get())
callback(); callback();
m_DeferredInitializers.reset(); GetDeferredInitializers().reset();
} }
void Utility::AddDeferredInitializer(const boost::function<void(void)>& callback) void Utility::AddDeferredInitializer(const boost::function<void(void)>& callback)
{ {
if (!m_DeferredInitializers.get()) if (!GetDeferredInitializers().get())
m_DeferredInitializers.reset(new std::vector<boost::function<void(void)> >()); GetDeferredInitializers().reset(new std::vector<boost::function<void(void)> >());
m_DeferredInitializers.get()->push_back(callback); GetDeferredInitializers().get()->push_back(callback);
} }
/** /**

View File

@ -141,8 +141,9 @@ private:
static boost::thread_specific_ptr<String> m_ThreadName; static boost::thread_specific_ptr<String> m_ThreadName;
static boost::thread_specific_ptr<unsigned int> m_RandSeed; static boost::thread_specific_ptr<unsigned int> m_RandSeed;
static boost::thread_specific_ptr<bool> m_LoadingLibrary;
static boost::thread_specific_ptr<std::vector<boost::function<void(void)> > > m_DeferredInitializers; static boost::thread_specific_ptr<std::vector<boost::function<void(void)> > >& GetDeferredInitializers(void);
}; };
} }