diff options
| -rw-r--r-- | indra/llcommon/llthreadlocalstorage.h | 58 | 
1 files changed, 44 insertions, 14 deletions
| diff --git a/indra/llcommon/llthreadlocalstorage.h b/indra/llcommon/llthreadlocalstorage.h index 91f45d4f5f..c8b7c5e229 100644 --- a/indra/llcommon/llthreadlocalstorage.h +++ b/indra/llcommon/llthreadlocalstorage.h @@ -151,15 +151,17 @@ public:  	virtual ~LLThreadLocalSingleton()  	{ -		sInstance = NULL; +#if LL_DARWIN +        //pthread_setspecific(sInstanceKey, NULL); +#else +        sInstance = NULL; +#endif  		setInitState(DELETED);  	}  	static void deleteSingleton()  	{ -		delete sInstance; -		sInstance = NULL; -		setInitState(DELETED); +		delete getIfExists();  	}  	static DERIVED_TYPE* getInstance() @@ -178,9 +180,24 @@ public:  		if (!getIfExists())  		{  			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); -			sInstance->initSingleton();  +			instancep->initSingleton();  			setInitState(INITIALIZED);  		} @@ -190,7 +207,7 @@ public:  	static DERIVED_TYPE* getIfExists()  	{  #if LL_DARWIN -        return sInstance.get(); +        return NULL;//(DERIVED_TYPE*)pthread_getspecific(sInstanceKey);  #else  		return sInstance;  #endif @@ -217,10 +234,23 @@ public:  		return getInitState() == DELETED;  	}  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()      {  #if LL_DARWIN -        return (EInitState)(int)sInitState.get(); +        return threadLocalInitState();  #else          return sInitState;  #endif @@ -229,7 +259,7 @@ private:      static void setInitState(EInitState state)      {  #if LL_DARWIN -        sInitState = (int*)state; +        threadLocalInitState() = state;  #else          sInitState = state;  #endif @@ -244,8 +274,8 @@ private:  	static __thread DERIVED_TYPE* sInstance;  	static __thread EInitState sInitState;  #elif LL_DARWIN -    static LLThreadLocalPointer<DERIVED_TYPE> sInstance; -    static LLThreadLocalPointer<int> sInitState; +    //static pthread_key_t sInstanceKey; +    //static pthread_key_t sInitStateKey;  #endif  }; @@ -262,11 +292,11 @@ __thread DERIVED_TYPE* LLThreadLocalSingleton<DERIVED_TYPE>::sInstance = NULL;  template<typename DERIVED_TYPE>  __thread typename LLThreadLocalSingleton<DERIVED_TYPE>::EInitState LLThreadLocalSingleton<DERIVED_TYPE>::sInitState = LLThreadLocalSingleton<DERIVED_TYPE>::UNINITIALIZED;  #elif LL_DARWIN -template<typename DERIVED_TYPE> -LLThreadLocalPointer<DERIVED_TYPE> LLThreadLocalSingleton<DERIVED_TYPE>::sInstance; +/*template<typename DERIVED_TYPE> +pthread_key_t LLThreadLocalSingleton<DERIVED_TYPE>::sInstanceKey;  template<typename DERIVED_TYPE> -LLThreadLocalPointer<int> LLThreadLocalSingleton<DERIVED_TYPE>::sInitState; +pthread_key_t LLThreadLocalSingleton<DERIVED_TYPE>::sInitStateKey;*/  #endif  template<typename DERIVED_TYPE> | 
