diff options
author | Richard Linden <none@none> | 2013-04-24 14:13:59 -0700 |
---|---|---|
committer | Richard Linden <none@none> | 2013-04-24 14:13:59 -0700 |
commit | 98161b566d6fa16ae67a48c98b8b087b0ad8d694 (patch) | |
tree | 03cec9453c18f53b3120e07ba74b4313e8c46541 /indra/llcommon/llsingleton.h | |
parent | 8026ac0dc9cb98eec6bb34cb6766c4150f876bf8 (diff) | |
parent | 84af0e9852486231b5ef0cde7ad1704d41689a3a (diff) |
Automated merge with ssh://hg.lindenlab.com/richard/viewer-interesting
Diffstat (limited to 'indra/llcommon/llsingleton.h')
-rw-r--r-- | indra/llcommon/llsingleton.h | 74 |
1 files changed, 18 insertions, 56 deletions
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index f6b0a7194b..697d1b042a 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -30,38 +30,6 @@ #include <typeinfo> #include <boost/noncopyable.hpp> -/// @brief A global registry of all singletons to prevent duplicate allocations -/// across shared library boundaries -class LL_COMMON_API LLSingletonRegistry { - private: - typedef std::map<std::string, void *> TypeMap; - static TypeMap * sSingletonMap; - - static void checkInit() - { - if(sSingletonMap == NULL) - { - sSingletonMap = new TypeMap(); - } - } - - public: - template<typename T> static void * & get() - { - std::string name(typeid(T).name()); - - checkInit(); - - // the first entry of the pair returned by insert will be either the existing - // iterator matching our key, or the newly inserted NULL initialized entry - // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html - TypeMap::iterator result = - sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; - - return result->second; - } -}; - // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -90,10 +58,9 @@ template <typename DERIVED_TYPE> class LLSingleton : private boost::noncopyable { -protected: +private: typedef enum e_init_state { - UNINITIALIZED, CONSTRUCTING, INITIALIZING, INITIALIZED, @@ -109,8 +76,11 @@ protected: SingletonInstanceData() : mSingletonInstance(NULL), - mInitState(UNINITIALIZED) - {} + mInitState(CONSTRUCTING) + { + mSingletonInstance = new DERIVED_TYPE(); + mInitState = INITIALIZING; + } ~SingletonInstanceData() { @@ -151,12 +121,12 @@ public: */ static void deleteSingleton() { - SingletonInstanceData& data = getSingletonData(); - delete data.mSingletonInstance; - data.mSingletonInstance = NULL; - data.mInitState = DELETED; + delete getSingletonData().mSingletonInstance; + getSingletonData().mSingletonInstance = NULL; + getSingletonData().mInitState = DELETED; } + static DERIVED_TYPE* getInstance() { SingletonInstanceData& data = getSingletonData(); @@ -171,13 +141,11 @@ public: llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl; } - if (!data.mSingletonInstance) + if (data.mInitState == INITIALIZING) { - data.mInitState = CONSTRUCTING; - data.mSingletonInstance = new DERIVED_TYPE(); - data.mInitState = INITIALIZING; - data.mSingletonInstance->initSingleton(); + // go ahead and flag ourselves as initialized so we can be reentrant during initialization data.mInitState = INITIALIZED; + data.mSingletonInstance->initSingleton(); } return data.mSingletonInstance; @@ -185,7 +153,7 @@ public: static DERIVED_TYPE* getIfExists() { - SingletonInstanceData& data = getSingletonData(); + SingletonInstanceData& data = getData(); return data.mSingletonInstance; } @@ -211,20 +179,14 @@ public: } private: + static SingletonInstanceData& getSingletonData() { // this is static to cache the lookup results - static void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>(); - - // *TODO - look into making this threadsafe - if(NULL == registry) - { - static SingletonInstanceData data; - registry = &data; - } - - return *static_cast<SingletonInstanceData *>(registry); + static SingletonInstanceData sData; + return sData; } + virtual void initSingleton() {} }; |