Akihiro Sagawa : kernelbase: Improve Get{, Dynamic}TimeZoneInformation() performance.

Alexandre Julliard julliard at winehq.org
Tue Mar 23 15:07:42 CDT 2021


Module: wine
Branch: oldstable
Commit: 8be47c712a13947e60d3d1b7f25d9cdb501d885a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8be47c712a13947e60d3d1b7f25d9cdb501d885a

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Fri Sep 25 00:07:50 2020 +0900

kernelbase: Improve Get{, Dynamic}TimeZoneInformation() performance.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49808
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit d5edadf35a40cb7238c2068db28b6c6abc7da800)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/kernelbase/locale.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 7 deletions(-)

diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index da69e5a1f3e..f3121648f15 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -3634,6 +3634,20 @@ INT WINAPI DECLSPEC_HOTPATCH GetCalendarInfoEx( const WCHAR *locale, CALID calen
     return GetCalendarInfoW( lcid, calendar, type, data, count, value );
 }
 
+static CRITICAL_SECTION tzname_section;
+static CRITICAL_SECTION_DEBUG tzname_section_debug =
+{
+    0, 0, &locale_section,
+    { &tzname_section_debug.ProcessLocksList, &tzname_section_debug.ProcessLocksList },
+      0, 0, { (DWORD_PTR)(__FILE__ ": tzname_section") }
+};
+static CRITICAL_SECTION tzname_section = { &tzname_section_debug, -1, 0, 0, 0, 0 };
+static struct {
+    LCID lcid;
+    WCHAR key_name[128];
+    WCHAR standard_name[32];
+    WCHAR daylight_name[32];
+} cached_tzname;
 
 /***********************************************************************
  *	GetDynamicTimeZoneInformation   (kernelbase.@)
@@ -3646,15 +3660,34 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetDynamicTimeZoneInformation( DYNAMIC_TIME_ZONE_
     if (!set_ntstatus( RtlQueryDynamicTimeZoneInformation( (RTL_DYNAMIC_TIME_ZONE_INFORMATION *)info )))
         return TIME_ZONE_ID_INVALID;
 
-    if (!RegOpenKeyExW( tz_key, info->TimeZoneKeyName, 0, KEY_ALL_ACCESS, &key ))
+    RtlEnterCriticalSection( &tzname_section );
+    if (cached_tzname.lcid == GetThreadLocale() &&
+        !wcscmp( info->TimeZoneKeyName, cached_tzname.key_name ))
+    {
+        wcscpy( info->StandardName, cached_tzname.standard_name );
+        wcscpy( info->DaylightName, cached_tzname.daylight_name );
+        RtlLeaveCriticalSection( &tzname_section );
+    }
+    else
     {
-        RegLoadMUIStringW( key, L"MUI_Std", info->StandardName,
-                           sizeof(info->StandardName), NULL, 0, system_dir );
-        RegLoadMUIStringW( key, L"MUI_Dlt", info->DaylightName,
-                           sizeof(info->DaylightName), NULL, 0, system_dir );
-        RegCloseKey( key );
+        RtlLeaveCriticalSection( &tzname_section );
+        if (!RegOpenKeyExW( tz_key, info->TimeZoneKeyName, 0, KEY_ALL_ACCESS, &key ))
+        {
+            RegLoadMUIStringW( key, L"MUI_Std", info->StandardName,
+                               sizeof(info->StandardName), NULL, 0, system_dir );
+            RegLoadMUIStringW( key, L"MUI_Dlt", info->DaylightName,
+                               sizeof(info->DaylightName), NULL, 0, system_dir );
+            RegCloseKey( key );
+        }
+        else return TIME_ZONE_ID_INVALID;
+
+        RtlEnterCriticalSection( &tzname_section );
+        cached_tzname.lcid = GetThreadLocale();
+        wcscpy( cached_tzname.key_name, info->TimeZoneKeyName );
+        wcscpy( cached_tzname.standard_name, info->StandardName );
+        wcscpy( cached_tzname.daylight_name, info->DaylightName );
+        RtlLeaveCriticalSection( &tzname_section );
     }
-    else return TIME_ZONE_ID_INVALID;
 
     NtQuerySystemTime( &now );
     return get_timezone_id( (TIME_ZONE_INFORMATION *)info, now, FALSE );




More information about the wine-cvs mailing list