From 60fccf72a2532f9505d26dda34e173e7d66a96f1 Mon Sep 17 00:00:00 2001 From: Andy Heninger Date: Mon, 9 Jun 2003 20:06:55 +0000 Subject: [PATCH] ICU-2970 Mutex initialization in translit. Thread safety in numformat. X-SVN-Rev: 12380 --- icu4c/source/i18n/numfmt.cpp | 26 ++++++++++++++++---------- icu4c/source/i18n/translit.cpp | 12 ++++++++++++ icu4c/source/i18n/tridpars.cpp | 3 +++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/icu4c/source/i18n/numfmt.cpp b/icu4c/source/i18n/numfmt.cpp index 79d8d5fcc85..5987bb48ded 100644 --- a/icu4c/source/i18n/numfmt.cpp +++ b/icu4c/source/i18n/numfmt.cpp @@ -445,10 +445,13 @@ getService(void) NumberFormat* NumberFormat::createInstance(const Locale& loc, EStyles kind, UErrorCode& status) { - if (gService != NULL) { - return (NumberFormat*)gService->get(loc, kind, status); - } else { - return makeInstance(loc, kind, status); + umtx_lock(NULL); + UBool haveService = gService != NULL; + umtx_unlock(NULL); + if (haveService) { + return (NumberFormat*)gService->get(loc, kind, status); + } else { + return makeInstance(loc, kind, status); } } @@ -471,13 +474,16 @@ NumberFormat::registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status) UBool NumberFormat::unregister(URegistryKey key, UErrorCode& status) { - if (U_SUCCESS(status)) { - if (gService != NULL) { - return gService->unregister(key, status); + if (U_SUCCESS(status)) { + umtx_lock(NULL); + UBool haveService = gService != NULL; + umtx_unlock(NULL); + if (haveService) { + return gService->unregister(key, status); + } + status = U_ILLEGAL_ARGUMENT_ERROR; } - status = U_ILLEGAL_ARGUMENT_ERROR; - } - return FALSE; + return FALSE; } // ------------------------------------- diff --git a/icu4c/source/i18n/translit.cpp b/icu4c/source/i18n/translit.cpp index 234f1e20717..f5e8a56e722 100644 --- a/icu4c/source/i18n/translit.cpp +++ b/icu4c/source/i18n/translit.cpp @@ -951,6 +951,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, TransliteratorAlias* alias = 0; Transliterator* t = 0; + umtx_init(®istryMutex); umtx_lock(®istryMutex); if (HAVE_REGISTRY) { t = registry->get(id, alias, pe, ec); @@ -1117,6 +1118,7 @@ UnicodeSet& Transliterator::getTargetSet(UnicodeSet& result) const { void Transliterator::registerFactory(const UnicodeString& id, Transliterator::Factory factory, Transliterator::Token context) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { _registerFactory(id, factory, context); @@ -1153,6 +1155,7 @@ void Transliterator::_registerSpecialInverse(const UnicodeString& target, * @see #unregister */ void Transliterator::registerInstance(Transliterator* adoptedPrototype) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { _registerInstance(adoptedPrototype); @@ -1172,6 +1175,7 @@ void Transliterator::_registerInstance(Transliterator* adoptedPrototype) { */ void Transliterator::unregister(const UnicodeString& ID) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { registry->remove(ID); @@ -1184,6 +1188,7 @@ void Transliterator::unregister(const UnicodeString& ID) { * i from 0 to countAvailableIDs() - 1. */ int32_t Transliterator::countAvailableIDs(void) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? registry->countAvailableIDs() : 0; } @@ -1195,6 +1200,7 @@ int32_t Transliterator::countAvailableIDs(void) { */ const UnicodeString& Transliterator::getAvailableID(int32_t index) { const UnicodeString* result = NULL; + umtx_init(®istryMutex); umtx_lock(®istryMutex); if (HAVE_REGISTRY) { result = ®istry->getAvailableID(index); @@ -1205,12 +1211,14 @@ const UnicodeString& Transliterator::getAvailableID(int32_t index) { } int32_t Transliterator::countAvailableSources(void) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableSources() : 0; } UnicodeString& Transliterator::getAvailableSource(int32_t index, UnicodeString& result) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { _getAvailableSource(index, result); @@ -1219,6 +1227,7 @@ UnicodeString& Transliterator::getAvailableSource(int32_t index, } int32_t Transliterator::countAvailableTargets(const UnicodeString& source) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableTargets(source) : 0; } @@ -1226,6 +1235,7 @@ int32_t Transliterator::countAvailableTargets(const UnicodeString& source) { UnicodeString& Transliterator::getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { _getAvailableTarget(index, source, result); @@ -1235,6 +1245,7 @@ UnicodeString& Transliterator::getAvailableTarget(int32_t index, int32_t Transliterator::countAvailableVariants(const UnicodeString& source, const UnicodeString& target) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableVariants(source, target) : 0; } @@ -1243,6 +1254,7 @@ UnicodeString& Transliterator::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result) { + umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { _getAvailableVariant(index, source, target, result); diff --git a/icu4c/source/i18n/tridpars.cpp b/icu4c/source/i18n/tridpars.cpp index 702d75bc905..33c5b263fb5 100644 --- a/icu4c/source/i18n/tridpars.cpp +++ b/icu4c/source/i18n/tridpars.cpp @@ -645,6 +645,7 @@ void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target, bidirectional = FALSE; } + umtx_init(&LOCK); Mutex lock(&LOCK); UErrorCode ec = U_ZERO_ERROR; @@ -837,6 +838,7 @@ TransliteratorIDParser::specsToSpecialInverse(const Specs& specs) { UnicodeString* inverseTarget; + umtx_init(&LOCK); umtx_lock(&LOCK); inverseTarget = (UnicodeString*) SPECIAL_INVERSES->get(specs.target); umtx_unlock(&LOCK); @@ -886,6 +888,7 @@ void TransliteratorIDParser::init() { Hashtable* special_inverses = new Hashtable(TRUE); special_inverses->setValueDeleter(uhash_deleteUnicodeString); + umtx_init(&LOCK); umtx_lock(&LOCK); if (SPECIAL_INVERSES == NULL) { SPECIAL_INVERSES = special_inverses;