Skip to content
Snippets Groups Projects
Commit a7450935 authored by Richard Linden's avatar Richard Linden
Browse files

Attempted fix for thread local storage on OS X

parent 91a8383b
No related branches found
No related tags found
No related merge requests found
...@@ -151,15 +151,17 @@ class LLThreadLocalSingleton ...@@ -151,15 +151,17 @@ class LLThreadLocalSingleton
virtual ~LLThreadLocalSingleton() virtual ~LLThreadLocalSingleton()
{ {
sInstance = NULL; #if LL_DARWIN
//pthread_setspecific(sInstanceKey, NULL);
#else
sInstance = NULL;
#endif
setInitState(DELETED); setInitState(DELETED);
} }
static void deleteSingleton() static void deleteSingleton()
{ {
delete sInstance; delete getIfExists();
sInstance = NULL;
setInitState(DELETED);
} }
static DERIVED_TYPE* getInstance() static DERIVED_TYPE* getInstance()
...@@ -178,9 +180,24 @@ class LLThreadLocalSingleton ...@@ -178,9 +180,24 @@ class LLThreadLocalSingleton
if (!getIfExists()) if (!getIfExists())
{ {
setInitState(CONSTRUCTING); setInitState(CONSTRUCTING);
sInstance = new DERIVED_TYPE(); DERIVED_TYPE* instancep = new DERIVED_TYPE();
#if LL_DARWIN
/*static S32 sKeyCreated = pthread_key_create(&sInstanceKey, NULL);
if (sKeyCreated != 0)
{
llerrs << "Could not create thread local storage" << llendl;
}
S32 result = pthread_setspecific(sInstanceKey, (void*)instancep);
if (result != 0)
{
llerrs << "Could not set thread local storage" << llendl;
}*/
#else
sInstance = instancep;
#endif
setInitState(INITIALIZING); setInitState(INITIALIZING);
sInstance->initSingleton(); instancep->initSingleton();
setInitState(INITIALIZED); setInitState(INITIALIZED);
} }
...@@ -190,7 +207,7 @@ class LLThreadLocalSingleton ...@@ -190,7 +207,7 @@ class LLThreadLocalSingleton
static DERIVED_TYPE* getIfExists() static DERIVED_TYPE* getIfExists()
{ {
#if LL_DARWIN #if LL_DARWIN
return sInstance.get(); return NULL;//(DERIVED_TYPE*)pthread_getspecific(sInstanceKey);
#else #else
return sInstance; return sInstance;
#endif #endif
...@@ -217,10 +234,23 @@ class LLThreadLocalSingleton ...@@ -217,10 +234,23 @@ class LLThreadLocalSingleton
return getInitState() == DELETED; return getInitState() == DELETED;
} }
private: private:
#if LL_DARWIN
static EInitState& threadLocalInitState()
{
/*static S32 sKeyCreated = pthread_key_create(&sInitStateKey, NULL);
if (sKeyCreated != 0)
{
llerrs << "Could not create thread local storage" << llendl;
}
return *(EInitState*)pthread_getspecific(sInitStateKey);*/
static EInitState state;
return state;
}
#endif
static EInitState getInitState() static EInitState getInitState()
{ {
#if LL_DARWIN #if LL_DARWIN
return (EInitState)(int)sInitState.get(); return threadLocalInitState();
#else #else
return sInitState; return sInitState;
#endif #endif
...@@ -229,7 +259,7 @@ class LLThreadLocalSingleton ...@@ -229,7 +259,7 @@ class LLThreadLocalSingleton
static void setInitState(EInitState state) static void setInitState(EInitState state)
{ {
#if LL_DARWIN #if LL_DARWIN
sInitState = (int*)state; threadLocalInitState() = state;
#else #else
sInitState = state; sInitState = state;
#endif #endif
...@@ -244,8 +274,8 @@ class LLThreadLocalSingleton ...@@ -244,8 +274,8 @@ class LLThreadLocalSingleton
static __thread DERIVED_TYPE* sInstance; static __thread DERIVED_TYPE* sInstance;
static __thread EInitState sInitState; static __thread EInitState sInitState;
#elif LL_DARWIN #elif LL_DARWIN
static LLThreadLocalPointer<DERIVED_TYPE> sInstance; //static pthread_key_t sInstanceKey;
static LLThreadLocalPointer<int> sInitState; //static pthread_key_t sInitStateKey;
#endif #endif
}; };
...@@ -262,11 +292,11 @@ __thread DERIVED_TYPE* LLThreadLocalSingleton<DERIVED_TYPE>::sInstance = NULL; ...@@ -262,11 +292,11 @@ __thread DERIVED_TYPE* LLThreadLocalSingleton<DERIVED_TYPE>::sInstance = NULL;
template<typename DERIVED_TYPE> template<typename DERIVED_TYPE>
__thread typename LLThreadLocalSingleton<DERIVED_TYPE>::EInitState LLThreadLocalSingleton<DERIVED_TYPE>::sInitState = LLThreadLocalSingleton<DERIVED_TYPE>::UNINITIALIZED; __thread typename LLThreadLocalSingleton<DERIVED_TYPE>::EInitState LLThreadLocalSingleton<DERIVED_TYPE>::sInitState = LLThreadLocalSingleton<DERIVED_TYPE>::UNINITIALIZED;
#elif LL_DARWIN #elif LL_DARWIN
template<typename DERIVED_TYPE> /*template<typename DERIVED_TYPE>
LLThreadLocalPointer<DERIVED_TYPE> LLThreadLocalSingleton<DERIVED_TYPE>::sInstance; pthread_key_t LLThreadLocalSingleton<DERIVED_TYPE>::sInstanceKey;
template<typename DERIVED_TYPE> template<typename DERIVED_TYPE>
LLThreadLocalPointer<int> LLThreadLocalSingleton<DERIVED_TYPE>::sInitState; pthread_key_t LLThreadLocalSingleton<DERIVED_TYPE>::sInitStateKey;*/
#endif #endif
template<typename DERIVED_TYPE> template<typename DERIVED_TYPE>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment