Zhiyi Zhang : ntdll: Restore the timezone bias cache.

Alexandre Julliard julliard at winehq.org
Tue Jul 26 15:40:52 CDT 2022


Module: wine
Branch: master
Commit: 45b5661c69d73bd777485b1707e355e0088ea825
URL:    https://gitlab.winehq.org/wine/wine/-/commit/45b5661c69d73bd777485b1707e355e0088ea825

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Mon Jul 25 12:01:07 2022 +0800

ntdll: Restore the timezone bias cache.

After 7161dcd, the timezone bias is calculated every time when SystemTimeOfDayInformation is queried.
This restores the cache for timezone bias.

Improve HROT framerate from ~100fps to ~500fps.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>

---

 dlls/ntdll/unix/system.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index f374fdec131..902b63c2b2f 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -236,6 +236,8 @@ static unsigned int logical_proc_info_len, logical_proc_info_alloc_len;
 static SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *logical_proc_info_ex;
 static unsigned int logical_proc_info_ex_size, logical_proc_info_ex_alloc_size;
 
+static pthread_mutex_t timezone_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /*******************************************************************************
  * Architecture specific feature detection for CPUs
  *
@@ -2562,17 +2564,28 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
 
     case SystemTimeOfDayInformation:  /* 3 */
     {
+        static LONGLONG last_bias;
+        static time_t last_utc;
         struct tm *tm;
-        time_t now;
+        time_t utc;
         SYSTEM_TIMEOFDAY_INFORMATION sti = {{{ 0 }}};
 
         sti.BootTime.QuadPart = server_start_time;
-        now = time( NULL );
-        tm = gmtime( &now );
-        sti.TimeZoneBias.QuadPart = mktime( tm ) - now;
-        tm = localtime( &now );
-        if (tm->tm_isdst) sti.TimeZoneBias.QuadPart -= 3600;
-        sti.TimeZoneBias.QuadPart *= TICKSPERSEC;
+
+        utc = time( NULL );
+        pthread_mutex_lock( &timezone_mutex );
+        if (utc != last_utc)
+        {
+            last_utc = utc;
+            tm = gmtime( &utc );
+            last_bias = mktime( tm ) - utc;
+            tm = localtime( &utc );
+            if (tm->tm_isdst) last_bias -= 3600;
+            last_bias *= TICKSPERSEC;
+        }
+        sti.TimeZoneBias.QuadPart = last_bias;
+        pthread_mutex_unlock( &timezone_mutex );
+
         NtQuerySystemTime( &sti.SystemTime );
 
         if (size <= sizeof(sti))




More information about the wine-cvs mailing list