mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-21 12:40:02 +00:00
ICU-12027 Improved thread safety of RuleBasedTransliterator.
X-SVN-Rev: 38110
This commit is contained in:
parent
f673fc0cf1
commit
ad1bbbe97b
1 changed files with 20 additions and 24 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue