summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llsingleton.cpp2
-rw-r--r--indra/llcommon/llsingleton.h28
2 files changed, 21 insertions, 9 deletions
diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index 62988cdc64..6b5feaf1c4 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -34,5 +34,5 @@
#include "llsingleton.h"
-std::map<std::string, void *> LLSingletonRegistry::sSingletonMap;
+std::map<std::string, void *> * LLSingletonRegistry::sSingletonMap = NULL;
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 00c87821c2..f55fafadd8 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -42,19 +42,30 @@
class LL_COMMON_API LLSingletonRegistry {
private:
typedef std::map<std::string, void *> TypeMap;
- static TypeMap sSingletonMap;
+ 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());
- if(0 == sSingletonMap.count(name))
- {
- sSingletonMap[name] = NULL;
- }
+ 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 sSingletonMap[typeid(T).name()];
+ return result->second;
}
};
@@ -130,12 +141,13 @@ public:
static SingletonInstanceData& getData()
{
- void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>();
- static SingletonInstanceData data;
+ // 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;
}