time: yet another speedup

Huw D M Davies h.davies1 at physics.ox.ac.uk
Tue Feb 24 06:31:56 CST 2004


        Huw Davies <huw at codeweavers.com>
        Call TIME_GetBias rather than RtlQueryTimeZoneInfo if we're
        only interested in the bias - it's faster.
-- 
Huw Davies
huw at codeweavers.com
--- dlls/ntdll/time.c	2004-02-24 12:24:18.000000000 +0000
+++ dlls/ntdll/time.c	2004-02-24 12:20:28.000000000 +0000
@@ -257,8 +257,6 @@
      'e','\0'}, -780, 0}
 };
 
-/*********** start of code by Rex Jolliff (rex at lvcablemodem.com) **************/
-
 #define TICKSPERSEC        10000000
 #define TICKSPERMSEC       10000
 #define SECSPERDAY         86400
@@ -469,6 +467,27 @@
 	return TRUE;
 }
 
+/***********************************************************************
+ *       TIME_GetBias [internal]
+ *
+ * Helper function calculates delta local time from UTC. 
+ *
+ * PARAMS
+ *   utc [I] The current utc time.
+ *   pdaylight [I] Local daylight.
+ *
+ * RETURNS
+ *   The bias for the current timezone.
+ */
+static int TIME_GetBias(time_t utc, int *pdaylight)
+{
+    struct tm *ptm = localtime(&utc);
+    *pdaylight = ptm->tm_isdst; /* daylight for local timezone */
+    ptm = gmtime(&utc);
+    ptm->tm_isdst = *pdaylight; /* use local daylight, not that of Greenwich */
+    return (int)(utc-mktime(ptm));
+}
+
 /******************************************************************************
  *        RtlLocalTimeToSystemTime [NTDLL.@]
  *
@@ -485,12 +504,15 @@
 NTSTATUS WINAPI RtlLocalTimeToSystemTime( const LARGE_INTEGER *LocalTime,
                                           PLARGE_INTEGER SystemTime)
 {
-    TIME_ZONE_INFORMATION tzinfo;
-
+    time_t gmt;
+    int bias, daylight;
+
     TRACE("(%p, %p)\n", LocalTime, SystemTime);
 
-    RtlQueryTimeZoneInformation(&tzinfo);
-    SystemTime->QuadPart = LocalTime->QuadPart + tzinfo.Bias * 60 * (LONGLONG)10000000;
+    gmt = time(NULL);
+    bias = TIME_GetBias(gmt, &daylight);
+
+    SystemTime->QuadPart = LocalTime->QuadPart - bias * (LONGLONG)10000000;
     return STATUS_SUCCESS;
 }
 
@@ -510,12 +532,15 @@
 NTSTATUS WINAPI RtlSystemTimeToLocalTime( const LARGE_INTEGER *SystemTime,
                                           PLARGE_INTEGER LocalTime )
 {
-    TIME_ZONE_INFORMATION tzinfo;
+    time_t gmt;
+    int bias, daylight;
 
     TRACE("(%p, %p)\n", SystemTime, LocalTime);
 
-    RtlQueryTimeZoneInformation(&tzinfo);
-    LocalTime->QuadPart = SystemTime->QuadPart - tzinfo.Bias * 60 * (LONGLONG)10000000;
+    gmt = time(NULL);
+    bias = TIME_GetBias(gmt, &daylight);
+
+    LocalTime->QuadPart = SystemTime->QuadPart + bias * (LONGLONG)10000000;
     return STATUS_SUCCESS;
 }
 
@@ -659,27 +684,6 @@
 }
 
 /***********************************************************************
- *       TIME_GetBias [internal]
- *
- * Helper function calculates delta local time from UTC. 
- *
- * PARAMS
- *   utc [I] The current utc time.
- *   pdaylight [I] Local daylight.
- *
- * RETURNS
- *   The bias for the current timezone.
- */
-static int TIME_GetBias(time_t utc, int *pdaylight)
-{
-    struct tm *ptm = localtime(&utc);
-    *pdaylight = ptm->tm_isdst; /* daylight for local timezone */
-    ptm = gmtime(&utc);
-    ptm->tm_isdst = *pdaylight; /* use local daylight, not that of Greenwich */
-    return (int)(utc-mktime(ptm));
-}
-
-/***********************************************************************
  *        TIME_GetTZAsStr [internal]
  *
  * Helper function that returns the given timezone as a string.



More information about the wine-patches mailing list