Reviewers: Mike Belshe, Mads Ager,

Message:
Here is the change in the daylight saving time lookup
code.  I also have a browser test for it, which I will email you.  I
would like someone in the US to test it on a US Windows system, to check
US DST calculations.

It is much faster on Windows XP SP 3.

Description:
Change Windows daylight saving time calculations to
use C stdlib local time functions, not Win32 functions.
Win32 time functions slowed down with Windows XP SP3.

Please review this at http://codereview.chromium.org/12824

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     src/platform-win32.cc


Index: src/platform-win32.cc
===================================================================
--- src/platform-win32.cc       (revision 875)
+++ src/platform-win32.cc       (working copy)
@@ -56,6 +56,7 @@

  #include <windows.h>

+#include <time.h>  // For LocalOffset() implementation.
  #include <mmsystem.h>  // For timeGetTime().
  #include <dbghelp.h>  // For SymLoadModule64 and al.
  #include <tlhelp32.h>  // For Module32First and al.
@@ -323,6 +324,8 @@
    // Just return if timezone information has already been initialized.
    if (tz_initialized_) return;

+  // Initialize POSIX time zone data
+  _tzset();
    // Obtain timezone information from operating system.
    memset(&tzinfo_, 0, sizeof(tzinfo_));
    if (GetTimeZoneInformation(&tzinfo_) == TIME_ZONE_ID_INVALID) {
@@ -396,9 +399,9 @@
    static bool initialized = false;
    static TimeStamp init_time;
    static DWORD init_ticks;
-  static const int kHundredNanosecondsPerSecond = 10000;
-  static const int kMaxClockElapsedTime =
-      60*60*24*kHundredNanosecondsPerSecond;  // 1 day
+  static const int64_t kHundredNanosecondsPerSecond = 10000000;
+  static const int64_t kMaxClockElapsedTime =
+      60*kHundredNanosecondsPerSecond;  // 1 minute

    // If we are uninitialized, we need to resync the clock.
    bool needs_resync = !initialized;
@@ -433,26 +436,31 @@
    // Initialize timezone information, if needed.
    TzSet();

-  // Convert timestamp to date/time components. These are now in UTC
-  // format. NB: Please do not replace the following three calls with one
-  // call to FileTimeToLocalFileTime(), because it does not handle
-  // daylight saving correctly.
-  SYSTEMTIME utc;
-  FileTimeToSystemTime(&ft(), &utc);
+  Time rounded_to_second(*this);
+  rounded_to_second.t() /= 1000 * kTimeScaler;
+  rounded_to_second.t() *= 1000 * kTimeScaler;
+  // Convert to local time using POSIX localtime function.
+  // Windows XP Service Pack 3 made SystemTimeToTzSpecificLocalTime()
+  // very slow.  Other browsers use localtime().

-  // Convert to local time, using timezone information.
-  SYSTEMTIME local;
-  SystemTimeToTzSpecificLocalTime(&tzinfo_, &utc, &local);
+  // Convert from JavaScript milliseconds past 1/1/1970 0:00:00 to
+  // POSIX seconds past 1/1/1970 0:00:00.
+  time_t posix_time = static_cast<time_t>(this->ToJSTime() / 1000);
+  // Conversion to standard year by callers of this function should ensure
+  // that the time is between the limits Jan 1, 1970 and Jan 1, 3001.
+  // Exceeding these limits will terminate the program. This is
+  // a Windows security feature.
+  if (posix_time >= 32535244800i64) return 0;  // Jan 1, 3001.  
_MAX__TIME64_T
+  // is reportedly the wrong limit, and is not declared in a standard  
header.
+  if (posix_time < 0 ) return 0;
+  // Convert to local time, as struct with fields for day, hour, year, etc.
+  tm posix_local_time_struct;
+  if (localtime_s(&posix_local_time_struct, &posix_time)) return 0;
+  // Convert local time in struct to POSIX time as if it were a UTC time.
+  time_t local_posix_time = _mkgmtime(&posix_local_time_struct);
+  Time localtime(1000.0 * local_posix_time);

-  // Convert local time back to a timestamp. This timestamp now
-  // has a bias similar to the local timezone bias in effect
-  // at the time of the original timestamp.
-  Time localtime;
-  SystemTimeToFileTime(&local, &localtime.ft());
-
-  // The difference between the new local timestamp and the original
-  // timestamp and is the local timezone offset.
-  return localtime.Diff(this);
+  return localtime.Diff(&rounded_to_second);
  }





--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to