mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-07 22:44:49 +00:00
ICU-2970 Mutex initialization in translit. Thread safety in numformat.
X-SVN-Rev: 12380
This commit is contained in:
parent
b623c7596b
commit
60fccf72a2
3 changed files with 31 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue