summaryrefslogtreecommitdiff
path: root/indra/llcommon/llsingleton.h
diff options
context:
space:
mode:
authorRichard Linden <none@none>2013-04-24 14:13:45 -0700
committerRichard Linden <none@none>2013-04-24 14:13:45 -0700
commit84af0e9852486231b5ef0cde7ad1704d41689a3a (patch)
treee4049f49451f9f4539a605af4d1976f35f129c3f /indra/llcommon/llsingleton.h
parentc6737163854981d94fde8bdd440eaf4bbc816b4f (diff)
SH-4080 WIP interesting: random crash on Mac
potential fix for crasher cleaned up llsingleton
Diffstat (limited to 'indra/llcommon/llsingleton.h')
-rw-r--r--indra/llcommon/llsingleton.h74
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() {}
};