ICU-2970 Mutex initialization in translit. Thread safety in numformat.

X-SVN-Rev: 12380
This commit is contained in:
Andy Heninger 2003-06-09 20:06:55 +00:00
parent b623c7596b
commit 60fccf72a2
3 changed files with 31 additions and 10 deletions

View file

@ -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;
}
// -------------------------------------

View file

@ -951,6 +951,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id,
TransliteratorAlias* alias = 0;
Transliterator* t = 0;
umtx_init(&registryMutex);
umtx_lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
if (HAVE_REGISTRY) {
_registerInstance(adoptedPrototype);
@ -1172,6 +1175,7 @@ void Transliterator::_registerInstance(Transliterator* adoptedPrototype) {
*/
void Transliterator::unregister(const UnicodeString& ID) {
umtx_init(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
umtx_lock(&registryMutex);
if (HAVE_REGISTRY) {
result = &registry->getAvailableID(index);
@ -1205,12 +1211,14 @@ const UnicodeString& Transliterator::getAvailableID(int32_t index) {
}
int32_t Transliterator::countAvailableSources(void) {
umtx_init(&registryMutex);
Mutex lock(&registryMutex);
return HAVE_REGISTRY ? _countAvailableSources() : 0;
}
UnicodeString& Transliterator::getAvailableSource(int32_t index,
UnicodeString& result) {
umtx_init(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
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(&registryMutex);
Mutex lock(&registryMutex);
if (HAVE_REGISTRY) {
_getAvailableVariant(index, source, target, result);

View file

@ -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;