[PATCH, take 2] Cache localised number chars

Michael Karcher wine at mkarcher.dialup.fu-berlin.de
Wed May 14 17:13:55 CDT 2008


As getting the localised number chars incurs one server round trip
per char, caching is definitely needed. Microsoft seems to cache
only the last locale (in OLEAUT32.DLL, version 2.40.4275), so we
do.
---

This is take 2 of the patch, including the needed synchronisation.
Thanks to Robert Shearman for pointing it out!

 dlls/oleaut32/variant.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 4eecfce..faff52d 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 localy, 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 */
-- 
1.5.5.1




More information about the wine-patches mailing list