From abaac300d13e8e9e93f937a22f7eba9fffd154b7 Mon Sep 17 00:00:00 2001 From: Michael Karcher Date: Thu, 15 May 2008 00:13:55 +0200 Subject: [PATCH] oleaut32: Cache localised number chars. --- dlls/oleaut32/variant.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 4eecfcecb0d..e6191d1c840 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -1468,9 +1468,25 @@ HRESULT WINAPI VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *lpUdate) static void VARIANT_GetLocalisedNumberChars(VARIANT_NUMBER_CHARS *lpChars, LCID lcid, DWORD dwFlags) { static const VARIANT_NUMBER_CHARS defaultChars = { '-','+','.',',','$',0,'.',',' }; + static CRITICAL_SECTION csLastChars = { NULL, -1, 0, 0, 0, 0 }; + static VARIANT_NUMBER_CHARS lastChars; + static LCID lastLcid = -1; + static DWORD lastFlags = 0; LCTYPE lctype = dwFlags & LOCALE_NOUSEROVERRIDE; WCHAR buff[4]; + /* To make caching thread-safe, a critical section is needed */ + EnterCriticalSection(&csLastChars); + + /* Asking for default locale entries is very expensive: It is a registry + server call. So cache one locally, as Microsoft does it too */ + if(lcid == lastLcid && dwFlags == lastFlags) + { + memcpy(lpChars, &lastChars, sizeof(defaultChars)); + LeaveCriticalSection(&csLastChars); + return; + } + memcpy(lpChars, &defaultChars, sizeof(defaultChars)); GET_NUMBER_TEXT(LOCALE_SNEGATIVESIGN, cNegativeSymbol); GET_NUMBER_TEXT(LOCALE_SPOSITIVESIGN, cPositiveSymbol); @@ -1490,6 +1506,11 @@ static void VARIANT_GetLocalisedNumberChars(VARIANT_NUMBER_CHARS *lpChars, LCID } TRACE("lcid 0x%x, cCurrencyLocal =%d,%d '%c','%c'\n", lcid, lpChars->cCurrencyLocal, lpChars->cCurrencyLocal2, lpChars->cCurrencyLocal, lpChars->cCurrencyLocal2); + + memcpy(&lastChars, lpChars, sizeof(defaultChars)); + lastLcid = lcid; + lastFlags = dwFlags; + LeaveCriticalSection(&csLastChars); } /* Number Parsing States */ -- 2.11.4.GIT