ICU-11031 cache spoof check data (ICU4C).

X-SVN-Rev: 37793
This commit is contained in:
Andy Heninger 2015-08-21 01:23:29 +00:00
parent 80a6684a7b
commit 38d07de467
2 changed files with 20 additions and 10 deletions

View File

@ -40,8 +40,8 @@ U_NAMESPACE_USE
static UnicodeSet *gInclusionSet = NULL;
static UnicodeSet *gRecommendedSet = NULL;
static const Normalizer2 *gNfdNormalizer = NULL;
static SpoofData *gDefaultSpoofData = NULL;
static UInitOnce gSpoofInitOnce = U_INITONCE_INITIALIZER;
static UBool U_CALLCONV
uspoof_cleanup(void) {
delete gInclusionSet;
@ -49,6 +49,10 @@ uspoof_cleanup(void) {
delete gRecommendedSet;
gRecommendedSet = NULL;
gNfdNormalizer = NULL;
if (gDefaultSpoofData) {
gDefaultSpoofData->removeReference(); // Will delete, assuming all user-level spoof checkers were closed.
}
gDefaultSpoofData = NULL;
gSpoofInitOnce.reset();
return TRUE;
}
@ -125,17 +129,24 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) {
gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat, -1, US_INV), status);
gRecommendedSet->freeze();
gNfdNormalizer = Normalizer2::getNFDInstance(status);
gDefaultSpoofData = SpoofData::getDefault(status);
ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup);
}
U_CAPI USpoofChecker * U_EXPORT2
uspoof_open(UErrorCode *status) {
umtx_initOnce(gSpoofInitOnce, &initializeStatics, *status);
if (U_FAILURE(*status)) {
return NULL;
}
umtx_initOnce(gSpoofInitOnce, &initializeStatics, *status);
SpoofImpl *si = new SpoofImpl(SpoofData::getDefault(*status), *status);
SpoofImpl *si = new SpoofImpl(gDefaultSpoofData, *status);
if (si) {
gDefaultSpoofData->addReference();
}
if (U_SUCCESS(*status) && si == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
}
if (U_FAILURE(*status)) {
delete si;
si = NULL;

View File

@ -1,6 +1,6 @@
/*
**********************************************************************
* Copyright (C) 2008-2014, International Business Machines
* Copyright (C) 2008-2015, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
@ -28,12 +28,11 @@ U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SpoofImpl)
SpoofImpl::SpoofImpl(SpoofData *data, UErrorCode &status) :
fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) ,
fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(data), fAllowedCharsSet(NULL) ,
fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) {
if (U_FAILURE(status)) {
return;
}
fSpoofData = data;
fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE;
UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff);
@ -502,9 +501,10 @@ spoofDataIsAcceptable(void *context,
// SpoofData::getDefault() - return a wrapper around the spoof data that is
// baked into the default ICU data.
//
// Called once, from the initOnce() function in uspoof_impl.cpp; the resulting
// SpoofData is shared by all spoof checkers using the default data.
//
SpoofData *SpoofData::getDefault(UErrorCode &status) {
// TODO: Cache it. Lazy create, keep until cleanup.
UDataMemory *udm = udata_openChoice(NULL, "cfu", "confusables",
spoofDataIsAcceptable,
NULL, // context, would receive dataVersion if supplied.
@ -567,7 +567,6 @@ SpoofData::SpoofData(UErrorCode &status) {
return;
}
fDataOwned = true;
fRefCount = 1;
// The spoof header should already be sized to be a multiple of 16 bytes.
// Just in case it's not, round it up.