ICU-12027 Improved thread safety of RuleBasedTransliterator.

X-SVN-Rev: 38110
This commit is contained in:
Andy Heninger 2015-12-08 01:29:24 +00:00
parent f673fc0cf1
commit ad1bbbe97b

View file

@ -240,31 +240,27 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition&
// Double-locking must be prevented in these cases.
//
// If the transliteration data is exclusively owned by this transliterator object,
// we don't need to do any locking. No sharing between transliterators is possible,
// so no concurrent access from multiple threads is possible.
UBool lockedMutexAtThisLevel = FALSE;
if (isDataOwned == FALSE) {
// Test whether this request is operating on the same text string as
// some other transliteration that is still in progress and holding the
// transliteration mutex. If so, do not lock the transliteration
// mutex again.
//
// gLockedText variable is protected by the global ICU mutex.
// Shared RBT data protected by transliteratorDataMutex.
//
// TODO(andy): Need a better scheme for handling this.
UBool needToLock;
{
Mutex m;
needToLock = (&text != gLockedText);
}
if (needToLock) {
umtx_lock(&transliteratorDataMutex); // Contention, longish waits possible here.
Mutex m;
gLockedText = &text;
lockedMutexAtThisLevel = TRUE;
}
// Test whether this request is operating on the same text string as
// some other transliteration that is still in progress and holding the
// transliteration mutex. If so, do not lock the transliteration
// mutex again.
//
// gLockedText variable is protected by the global ICU mutex.
// Shared RBT data protected by transliteratorDataMutex.
//
// TODO(andy): Need a better scheme for handling this.
UBool needToLock;
{
Mutex m;
needToLock = (&text != gLockedText);
}
if (needToLock) {
umtx_lock(&transliteratorDataMutex); // Contention, longish waits possible here.
Mutex m;
gLockedText = &text;
lockedMutexAtThisLevel = TRUE;
}
// Check to make sure we don't dereference a null pointer.