diff --git a/icu4c/source/common/locid.cpp b/icu4c/source/common/locid.cpp index 390f248b179..e5834be8720 100644 --- a/icu4c/source/common/locid.cpp +++ b/icu4c/source/common/locid.cpp @@ -33,6 +33,8 @@ #include "unicode/locid.h" #include "unicode/uloc.h" #include "mutex.h" +#include "umutex.h" +#include "uassert.h" #include "cmemory.h" #include "cstring.h" #include "uhash.h" @@ -100,13 +102,10 @@ void locale_set_default_internal(const char *id) { U_NAMESPACE_USE - if (gLocaleCache == NULL) { - Locale::initLocaleCache(); - } - + Locale *localeCache = Locale::getLocaleCache(); { Mutex lock; - gLocaleCache[eDEFAULT].init(id); + localeCache[eDEFAULT].init(id); } } U_NAMESPACE_END @@ -404,7 +403,7 @@ Locale& Locale::init(const char* localeID) return *this; } while(0); - if (gLocaleCache) { + if (gLocaleCache) { // no mutex, but ok. // when an error occurs, then set the default locale (there is no UErrorCode here) return *this = getLocale(eDEFAULT); } @@ -449,13 +448,10 @@ Locale::setDefault( const Locale& newLocale, if (U_FAILURE(status)) return; - if (gLocaleCache == NULL) { - initLocaleCache(); - } - + Locale *localeCache = getLocaleCache(); { Mutex lock; - gLocaleCache[eDEFAULT] = newLocale; + localeCache[eDEFAULT] = newLocale; } } @@ -684,23 +680,32 @@ const Locale* Locale::getAvailableLocales(int32_t& count) { // for now, there is a hardcoded list, so just walk through that list and set it up. - if (availableLocaleList == 0) { + umtx_lock(NULL); + UBool needInit = availableLocaleList == 0; + umtx_unlock(NULL); + + if (needInit) { int32_t locCount = uloc_countAvailable(); Locale *newLocaleList = new Locale[locCount]; - + count = locCount; - + while(--locCount >= 0) { newLocaleList[locCount].setFromPOSIXID(uloc_getAvailable(locCount)); } - - Mutex mutex; - if(availableLocaleList != 0) { - delete []newLocaleList; - } - else { + + umtx_lock(NULL); + if(availableLocaleList == 0) { availableLocaleListCount = count; availableLocaleList = newLocaleList; + newLocaleList = NULL; + } + umtx_unlock(NULL); + if (newLocaleList != NULL) { + for (locCount=0; locCount