Just an fyi, beware of: http://securityvulns.com/advisories/year3000.asp
-- dean On Mon, Dec 1, 2008 at 5:50 AM, <[EMAIL PROTECTED]> wrote: > > 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 -~----------~----~----~----~------~----~------~--~---
