ICU-2787 revise double-check code to improve thread safety
X-SVN-Rev: 11785
This commit is contained in:
parent
b236d896f6
commit
f4d9e46ab0
@ -2981,25 +2981,24 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern,
|
|||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
const UnicodeSet* UnicodeSet::getInclusions(UErrorCode &status) {
|
const UnicodeSet* UnicodeSet::getInclusions(UErrorCode &status) {
|
||||||
if (INCLUSIONS == NULL) {
|
umtx_lock(NULL);
|
||||||
UnicodeSet *incl = new UnicodeSet();
|
UBool f = (INCLUSIONS == NULL);
|
||||||
if(incl == NULL) {
|
umtx_unlock(NULL);
|
||||||
|
if (f) {
|
||||||
|
UnicodeSet* incl = new UnicodeSet();
|
||||||
|
if (incl != NULL) {
|
||||||
|
uprv_getInclusions((USet*)incl, &status);
|
||||||
|
if (U_SUCCESS(status)) {
|
||||||
|
umtx_lock(NULL);
|
||||||
|
if (INCLUSIONS == NULL) {
|
||||||
|
INCLUSIONS = incl;
|
||||||
|
incl = NULL;
|
||||||
|
}
|
||||||
|
umtx_unlock(NULL);
|
||||||
|
}
|
||||||
|
delete incl;
|
||||||
|
} else {
|
||||||
status = U_MEMORY_ALLOCATION_ERROR;
|
status = U_MEMORY_ALLOCATION_ERROR;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
uprv_getInclusions((USet *)incl, &status);
|
|
||||||
if(U_FAILURE(status)) {
|
|
||||||
delete incl;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
umtx_lock(NULL);
|
|
||||||
if (INCLUSIONS == NULL) {
|
|
||||||
INCLUSIONS = incl;
|
|
||||||
incl = NULL;
|
|
||||||
}
|
|
||||||
umtx_unlock(NULL);
|
|
||||||
if(incl != NULL) {
|
|
||||||
delete incl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return INCLUSIONS;
|
return INCLUSIONS;
|
||||||
@ -3493,30 +3492,34 @@ void UnicodeSet::caseCloseOne(const CaseEquivClass& c) {
|
|||||||
* CaseEquivClass containing this string, or NULL if none.
|
* CaseEquivClass containing this string, or NULL if none.
|
||||||
*/
|
*/
|
||||||
const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) {
|
const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) {
|
||||||
|
umtx_lock(NULL);
|
||||||
|
UBool f = (CASE_EQUIV_HASH == NULL);
|
||||||
|
umtx_unlock(NULL);
|
||||||
|
|
||||||
if (CASE_EQUIV_HASH == NULL) {
|
if (f) {
|
||||||
// Create the Hashtable, which maps UnicodeStrings to index
|
// Create the Hashtable, which maps UnicodeStrings to index
|
||||||
// values into CASE_NONPAIRS.
|
// values into CASE_NONPAIRS.
|
||||||
UErrorCode ec = U_ZERO_ERROR;
|
UErrorCode ec = U_ZERO_ERROR;
|
||||||
Hashtable* hash = new Hashtable();
|
Hashtable* hash = new Hashtable();
|
||||||
int32_t i;
|
if (hash != NULL) {
|
||||||
for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) {
|
int32_t i;
|
||||||
const CaseEquivClass* c = &CASE_NONPAIRS[i];
|
for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) {
|
||||||
const UChar* p;
|
const CaseEquivClass* c = &CASE_NONPAIRS[i];
|
||||||
for (c->getStrings(p); *p; c->nextString(p)) {
|
const UChar* p;
|
||||||
hash->put(UnicodeString(p), (void*) c, ec);
|
for (c->getStrings(p); *p; c->nextString(p)) {
|
||||||
|
hash->put(UnicodeString(p), (void*) c, ec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (U_SUCCESS(ec)) {
|
||||||
if (U_SUCCESS(ec)) {
|
umtx_lock(NULL);
|
||||||
umtx_lock(NULL);
|
if (CASE_EQUIV_HASH == NULL) {
|
||||||
if (CASE_EQUIV_HASH == NULL) {
|
CASE_EQUIV_HASH = hash;
|
||||||
CASE_EQUIV_HASH = hash;
|
hash = NULL;
|
||||||
hash = NULL;
|
}
|
||||||
|
umtx_unlock(NULL);
|
||||||
}
|
}
|
||||||
umtx_unlock(NULL);
|
delete hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete hash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (CASE_EQUIV_HASH != NULL) ?
|
return (CASE_EQUIV_HASH != NULL) ?
|
||||||
@ -3528,8 +3531,11 @@ const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) {
|
|||||||
* or NULL if none.
|
* or NULL if none.
|
||||||
*/
|
*/
|
||||||
const CaseEquivClass* UnicodeSet::getCaseMapOf(UChar folded) {
|
const CaseEquivClass* UnicodeSet::getCaseMapOf(UChar folded) {
|
||||||
|
umtx_lock(NULL);
|
||||||
|
UBool f = (CASE_EQUIV_CBA == NULL);
|
||||||
|
umtx_unlock(NULL);
|
||||||
|
|
||||||
if (CASE_EQUIV_CBA == NULL) {
|
if (f) {
|
||||||
// Create the CompactByteArray, which maps single code units
|
// Create the CompactByteArray, which maps single code units
|
||||||
// to index values into CASE_NONPAIRS.
|
// to index values into CASE_NONPAIRS.
|
||||||
CompactByteArray* cba = ucmp8_open(-1);
|
CompactByteArray* cba = ucmp8_open(-1);
|
||||||
|
Loading…
Reference in New Issue
Block a user