| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Platform-specific code for Win32. | 5 // Platform-specific code for Win32. |
| 6 | 6 |
| 7 // Secure API functions are not available using MinGW with msvcrt.dll | 7 // Secure API functions are not available using MinGW with msvcrt.dll |
| 8 // on Windows XP. Make sure MINGW_HAS_SECURE_API is not defined to | 8 // on Windows XP. Make sure MINGW_HAS_SECURE_API is not defined to |
| 9 // disable definition of secure API functions in standard headers that | 9 // disable definition of secure API functions in standard headers that |
| 10 // would conflict with our own implementation. | 10 // would conflict with our own implementation. |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 init_ticks = ticks_now = timeGetTime(); | 339 init_ticks = ticks_now = timeGetTime(); |
| 340 initialized = true; | 340 initialized = true; |
| 341 } | 341 } |
| 342 | 342 |
| 343 // Finally, compute the actual time. Why is this so hard. | 343 // Finally, compute the actual time. Why is this so hard. |
| 344 DWORD elapsed = ticks_now - init_ticks; | 344 DWORD elapsed = ticks_now - init_ticks; |
| 345 this->time_.t_ = init_time.t_ + (static_cast<int64_t>(elapsed) * 10000); | 345 this->time_.t_ = init_time.t_ + (static_cast<int64_t>(elapsed) * 10000); |
| 346 } | 346 } |
| 347 | 347 |
| 348 | 348 |
| 349 int64_t FileTimeToInt64(FILETIME ft) { |
| 350 ULARGE_INTEGER result; |
| 351 result.LowPart = ft.dwLowDateTime; |
| 352 result.HighPart = ft.dwHighDateTime; |
| 353 return static_cast<int64_t>(result.QuadPart); |
| 354 } |
| 355 |
| 356 |
| 349 // Return the local timezone offset in milliseconds east of UTC. This | 357 // Return the local timezone offset in milliseconds east of UTC. This |
| 350 // takes into account whether daylight saving is in effect at the time. | 358 // takes into account whether daylight saving is in effect at the time. |
| 351 // Only times in the 32-bit Unix range may be passed to this function. | 359 // Only times in the 32-bit Unix range may be passed to this function. |
| 352 // Also, adding the time-zone offset to the input must not overflow. | 360 // Also, adding the time-zone offset to the input must not overflow. |
| 353 // The function EquivalentTime() in date.js guarantees this. | 361 // The function EquivalentTime() in date.js guarantees this. |
| 354 int64_t Win32Time::LocalOffset(TimezoneCache* cache) { | 362 int64_t Win32Time::LocalOffset(TimezoneCache* cache) { |
| 355 cache->InitializeIfNeeded(); | 363 FILETIME local; |
| 356 | 364 SYSTEMTIME system_utc, system_local; |
| 357 Win32Time rounded_to_second(*this); | 365 FileTimeToSystemTime(&time_.ft_, &system_utc); |
| 358 rounded_to_second.t() = rounded_to_second.t() / 1000 / kTimeScaler * | 366 SystemTimeToTzSpecificLocalTime(NULL, &system_utc, &system_local); |
| 359 1000 * kTimeScaler; | 367 SystemTimeToFileTime(&system_local, &local); |
| 360 // Convert to local time using POSIX localtime function. | 368 return (FileTimeToInt64(local) - FileTimeToInt64(time_.ft_)) / kTimeScaler; |
| 361 // Windows XP Service Pack 3 made SystemTimeToTzSpecificLocalTime() | |
| 362 // very slow. Other browsers use localtime(). | |
| 363 | |
| 364 // Convert from JavaScript milliseconds past 1/1/1970 0:00:00 to | |
| 365 // POSIX seconds past 1/1/1970 0:00:00. | |
| 366 double unchecked_posix_time = rounded_to_second.ToJSTime() / 1000; | |
| 367 if (unchecked_posix_time > INT_MAX || unchecked_posix_time < 0) { | |
| 368 return 0; | |
| 369 } | |
| 370 // Because _USE_32BIT_TIME_T is defined, time_t is a 32-bit int. | |
| 371 time_t posix_time = static_cast<time_t>(unchecked_posix_time); | |
| 372 | |
| 373 // Convert to local time, as struct with fields for day, hour, year, etc. | |
| 374 tm posix_local_time_struct; | |
| 375 if (localtime_s(&posix_local_time_struct, &posix_time)) return 0; | |
| 376 | |
| 377 if (posix_local_time_struct.tm_isdst > 0) { | |
| 378 return (cache->tzinfo_.Bias + cache->tzinfo_.DaylightBias) * -kMsPerMinute; | |
| 379 } else if (posix_local_time_struct.tm_isdst == 0) { | |
| 380 return (cache->tzinfo_.Bias + cache->tzinfo_.StandardBias) * -kMsPerMinute; | |
| 381 } else { | |
| 382 return cache->tzinfo_.Bias * -kMsPerMinute; | |
| 383 } | |
| 384 } | 369 } |
| 385 | 370 |
| 386 | 371 |
| 387 // Return whether or not daylight savings time is in effect at this time. | 372 // Return whether or not daylight savings time is in effect at this time. |
| 388 bool Win32Time::InDST(TimezoneCache* cache) { | 373 bool Win32Time::InDST(TimezoneCache* cache) { |
| 389 cache->InitializeIfNeeded(); | 374 cache->InitializeIfNeeded(); |
| 390 | 375 |
| 391 // Determine if DST is in effect at the specified time. | 376 // Determine if DST is in effect at the specified time. |
| 392 bool in_dst = false; | 377 bool in_dst = false; |
| 393 if (cache->tzinfo_.StandardDate.wMonth != 0 || | 378 if (cache->tzinfo_.StandardDate.wMonth != 0 || |
| (...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1381 DCHECK(result); | 1366 DCHECK(result); |
| 1382 } | 1367 } |
| 1383 | 1368 |
| 1384 | 1369 |
| 1385 | 1370 |
| 1386 void Thread::YieldCPU() { | 1371 void Thread::YieldCPU() { |
| 1387 Sleep(0); | 1372 Sleep(0); |
| 1388 } | 1373 } |
| 1389 | 1374 |
| 1390 } } // namespace v8::base | 1375 } } // namespace v8::base |
| OLD | NEW |