| /* |
| ******************************************************************************* |
| * |
| * Copyright (C) 2008-2010, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| * file name: mutex.cpp |
| * encoding: US-ASCII |
| * tab size: 8 (not used) |
| * indentation:4 |
| */ |
| |
| #include "unicode/utypes.h" |
| #include "mutex.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| void *SimpleSingleton::getInstance(InstantiatorFn *instantiator, const void *context, |
| void *&duplicate, |
| UErrorCode &errorCode) { |
| duplicate=NULL; |
| if(U_FAILURE(errorCode)) { |
| return NULL; |
| } |
| void *instance; |
| UMTX_CHECK(NULL, fInstance, instance); |
| if(instance!=NULL) { |
| return instance; |
| } else { |
| instance=instantiator(context, errorCode); |
| Mutex mutex; |
| if(fInstance==NULL && U_SUCCESS(errorCode)) { |
| fInstance=instance; |
| } else { |
| duplicate=instance; |
| } |
| return fInstance; |
| } |
| } |
| |
| void *TriStateSingleton::getInstance(InstantiatorFn *instantiator, const void *context, |
| void *&duplicate, |
| UErrorCode &errorCode) { |
| duplicate=NULL; |
| if(U_FAILURE(errorCode)) { |
| return NULL; |
| } |
| int8_t haveInstance; |
| UMTX_CHECK(NULL, fHaveInstance, haveInstance); |
| if(haveInstance>0) { |
| return fInstance; // instance was created |
| } else if(haveInstance<0) { |
| errorCode=fErrorCode; // instance creation failed |
| return NULL; |
| } else /* haveInstance==0 */ { |
| void *instance=instantiator(context, errorCode); |
| Mutex mutex; |
| if(fHaveInstance==0) { |
| if(U_SUCCESS(errorCode)) { |
| fInstance=instance; |
| instance=NULL; |
| fHaveInstance=1; |
| } else { |
| fErrorCode=errorCode; |
| fHaveInstance=-1; |
| } |
| } else { |
| errorCode=fErrorCode; |
| } |
| duplicate=instance; |
| return fInstance; |
| } |
| } |
| |
| void TriStateSingleton::reset() { |
| fInstance=NULL; |
| fErrorCode=U_ZERO_ERROR; |
| fHaveInstance=0; |
| } |
| |
| #if UCONFIG_NO_SERVICE |
| |
| /* If UCONFIG_NO_SERVICE, then there is no invocation of Mutex elsewhere in |
| common, so add one here to force an export */ |
| static Mutex *aMutex = 0; |
| |
| /* UCONFIG_NO_SERVICE */ |
| #endif |
| |
| U_NAMESPACE_END |