| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 | 233 |
| 234 // ---------------------------------------------------------------------------- | 234 // ---------------------------------------------------------------------------- |
| 235 // The Time class represents time on win32. A timestamp is represented as | 235 // The Time class represents time on win32. A timestamp is represented as |
| 236 // a 64-bit integer in 100 nanoseconds since January 1, 1601 (UTC). JavaScript | 236 // a 64-bit integer in 100 nanoseconds since January 1, 1601 (UTC). JavaScript |
| 237 // timestamps are represented as a doubles in milliseconds since 00:00:00 UTC, | 237 // timestamps are represented as a doubles in milliseconds since 00:00:00 UTC, |
| 238 // January 1, 1970. | 238 // January 1, 1970. |
| 239 | 239 |
| 240 class Win32Time { | 240 class Win32Time { |
| 241 public: | 241 public: |
| 242 // Constructors. | 242 // Constructors. |
| 243 Win32Time(); |
| 243 explicit Win32Time(double jstime); | 244 explicit Win32Time(double jstime); |
| 244 Win32Time(int year, int mon, int day, int hour, int min, int sec); | 245 Win32Time(int year, int mon, int day, int hour, int min, int sec); |
| 245 | 246 |
| 246 // Convert timestamp to JavaScript representation. | 247 // Convert timestamp to JavaScript representation. |
| 247 double ToJSTime(); | 248 double ToJSTime(); |
| 248 | 249 |
| 250 // Set timestamp to current time. |
| 251 void SetToCurrentTime(); |
| 252 |
| 249 // Returns the local timezone offset in milliseconds east of UTC. This is | 253 // Returns the local timezone offset in milliseconds east of UTC. This is |
| 250 // the number of milliseconds you must add to UTC to get local time, i.e. | 254 // the number of milliseconds you must add to UTC to get local time, i.e. |
| 251 // LocalOffset(CET) = 3600000 and LocalOffset(PST) = -28800000. This | 255 // LocalOffset(CET) = 3600000 and LocalOffset(PST) = -28800000. This |
| 252 // routine also takes into account whether daylight saving is effect | 256 // routine also takes into account whether daylight saving is effect |
| 253 // at the time. | 257 // at the time. |
| 254 int64_t LocalOffset(); | 258 int64_t LocalOffset(); |
| 255 | 259 |
| 256 // Returns the daylight savings time offset for the time in milliseconds. | 260 // Returns the daylight savings time offset for the time in milliseconds. |
| 257 int64_t DaylightSavingsOffset(); | 261 int64_t DaylightSavingsOffset(); |
| 258 | 262 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 }; | 311 }; |
| 308 | 312 |
| 309 | 313 |
| 310 // Static variables. | 314 // Static variables. |
| 311 bool Win32Time::tz_initialized_ = false; | 315 bool Win32Time::tz_initialized_ = false; |
| 312 TIME_ZONE_INFORMATION Win32Time::tzinfo_; | 316 TIME_ZONE_INFORMATION Win32Time::tzinfo_; |
| 313 char Win32Time::std_tz_name_[kTzNameSize]; | 317 char Win32Time::std_tz_name_[kTzNameSize]; |
| 314 char Win32Time::dst_tz_name_[kTzNameSize]; | 318 char Win32Time::dst_tz_name_[kTzNameSize]; |
| 315 | 319 |
| 316 | 320 |
| 321 // Initialize timestamp to start of epoc. |
| 322 Win32Time::Win32Time() { |
| 323 t() = 0; |
| 324 } |
| 325 |
| 326 |
| 317 // Initialize timestamp from a JavaScript timestamp. | 327 // Initialize timestamp from a JavaScript timestamp. |
| 318 Win32Time::Win32Time(double jstime) { | 328 Win32Time::Win32Time(double jstime) { |
| 319 t() = static_cast<int64_t>(jstime) * kTimeScaler + kTimeEpoc; | 329 t() = static_cast<int64_t>(jstime) * kTimeScaler + kTimeEpoc; |
| 320 } | 330 } |
| 321 | 331 |
| 322 | 332 |
| 323 // Initialize timestamp from date/time components. | 333 // Initialize timestamp from date/time components. |
| 324 Win32Time::Win32Time(int year, int mon, int day, int hour, int min, int sec) { | 334 Win32Time::Win32Time(int year, int mon, int day, int hour, int min, int sec) { |
| 325 SYSTEMTIME st; | 335 SYSTEMTIME st; |
| 326 st.wYear = year; | 336 st.wYear = year; |
| 327 st.wMonth = mon; | 337 st.wMonth = mon; |
| 328 st.wDay = day; | 338 st.wDay = day; |
| 329 st.wHour = hour; | 339 st.wHour = hour; |
| 330 st.wMinute = min; | 340 st.wMinute = min; |
| 331 st.wSecond = sec; | 341 st.wSecond = sec; |
| 332 st.wMilliseconds = 0; | 342 st.wMilliseconds = 0; |
| 333 SystemTimeToFileTime(&st, &ft()); | 343 SystemTimeToFileTime(&st, &ft()); |
| 334 } | 344 } |
| 335 | 345 |
| 336 | 346 |
| 337 // Convert timestamp to JavaScript timestamp. | 347 // Convert timestamp to JavaScript timestamp. |
| 338 double Win32Time::ToJSTime() { | 348 double Win32Time::ToJSTime() { |
| 339 return static_cast<double>((t() - kTimeEpoc) / kTimeScaler); | 349 return static_cast<double>((t() - kTimeEpoc) / kTimeScaler); |
| 340 } | 350 } |
| 341 | 351 |
| 342 | 352 |
| 353 // Set timestamp to current time. |
| 354 void Win32Time::SetToCurrentTime() { |
| 355 // The default GetSystemTimeAsFileTime has a ~15.5ms resolution. |
| 356 // Because we're fast, we like fast timers which have at least a |
| 357 // 1ms resolution. |
| 358 // |
| 359 // timeGetTime() provides 1ms granularity when combined with |
| 360 // timeBeginPeriod(). If the host application for v8 wants fast |
| 361 // timers, it can use timeBeginPeriod to increase the resolution. |
| 362 // |
| 363 // Using timeGetTime() has a drawback because it is a 32bit value |
| 364 // and hence rolls-over every ~49days. |
| 365 // |
| 366 // To use the clock, we use GetSystemTimeAsFileTime as our base; |
| 367 // and then use timeGetTime to extrapolate current time from the |
| 368 // start time. To deal with rollovers, we resync the clock |
| 369 // any time when more than kMaxClockElapsedTime has passed or |
| 370 // whenever timeGetTime creates a rollover. |
| 371 |
| 372 static bool initialized = false; |
| 373 static TimeStamp init_time; |
| 374 static DWORD init_ticks; |
| 375 static const int64_t kHundredNanosecondsPerSecond = 10000000; |
| 376 static const int64_t kMaxClockElapsedTime = |
| 377 60*kHundredNanosecondsPerSecond; // 1 minute |
| 378 |
| 379 // If we are uninitialized, we need to resync the clock. |
| 380 bool needs_resync = !initialized; |
| 381 |
| 382 // Get the current time. |
| 383 TimeStamp time_now; |
| 384 GetSystemTimeAsFileTime(&time_now.ft_); |
| 385 DWORD ticks_now = timeGetTime(); |
| 386 |
| 387 // Check if we need to resync due to clock rollover. |
| 388 needs_resync |= ticks_now < init_ticks; |
| 389 |
| 390 // Check if we need to resync due to elapsed time. |
| 391 needs_resync |= (time_now.t_ - init_time.t_) > kMaxClockElapsedTime; |
| 392 |
| 393 // Check if we need to resync due to backwards time change. |
| 394 needs_resync |= time_now.t_ < init_time.t_; |
| 395 |
| 396 // Resync the clock if necessary. |
| 397 if (needs_resync) { |
| 398 GetSystemTimeAsFileTime(&init_time.ft_); |
| 399 init_ticks = ticks_now = timeGetTime(); |
| 400 initialized = true; |
| 401 } |
| 402 |
| 403 // Finally, compute the actual time. Why is this so hard. |
| 404 DWORD elapsed = ticks_now - init_ticks; |
| 405 this->time_.t_ = init_time.t_ + (static_cast<int64_t>(elapsed) * 10000); |
| 406 } |
| 407 |
| 408 |
| 343 // Guess the name of the timezone from the bias. | 409 // Guess the name of the timezone from the bias. |
| 344 // The guess is very biased towards the northern hemisphere. | 410 // The guess is very biased towards the northern hemisphere. |
| 345 const char* Win32Time::GuessTimezoneNameFromBias(int bias) { | 411 const char* Win32Time::GuessTimezoneNameFromBias(int bias) { |
| 346 static const int kHour = 60; | 412 static const int kHour = 60; |
| 347 switch (-bias) { | 413 switch (-bias) { |
| 348 case -9*kHour: return "Alaska"; | 414 case -9*kHour: return "Alaska"; |
| 349 case -8*kHour: return "Pacific"; | 415 case -8*kHour: return "Pacific"; |
| 350 case -7*kHour: return "Mountain"; | 416 case -7*kHour: return "Mountain"; |
| 351 case -6*kHour: return "Central"; | 417 case -6*kHour: return "Central"; |
| 352 case -5*kHour: return "Eastern"; | 418 case -5*kHour: return "Eastern"; |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 // Convert to seconds and microseconds | 588 // Convert to seconds and microseconds |
| 523 *secs = static_cast<uint32_t>(usertime / 1000000); | 589 *secs = static_cast<uint32_t>(usertime / 1000000); |
| 524 *usecs = static_cast<uint32_t>(usertime % 1000000); | 590 *usecs = static_cast<uint32_t>(usertime % 1000000); |
| 525 return 0; | 591 return 0; |
| 526 } | 592 } |
| 527 | 593 |
| 528 | 594 |
| 529 // Returns current time as the number of milliseconds since | 595 // Returns current time as the number of milliseconds since |
| 530 // 00:00:00 UTC, January 1, 1970. | 596 // 00:00:00 UTC, January 1, 1970. |
| 531 double OS::TimeCurrentMillis() { | 597 double OS::TimeCurrentMillis() { |
| 532 return Time::Now().ToJsTime(); | 598 Win32Time t; |
| 599 t.SetToCurrentTime(); |
| 600 return t.ToJSTime(); |
| 533 } | 601 } |
| 534 | 602 |
| 535 | 603 |
| 536 // Returns a string identifying the current timezone taking into | 604 // Returns a string identifying the current timezone taking into |
| 537 // account daylight saving. | 605 // account daylight saving. |
| 538 const char* OS::LocalTimezone(double time) { | 606 const char* OS::LocalTimezone(double time) { |
| 539 return Win32Time(time).LocalTimezone(); | 607 return Win32Time(time).LocalTimezone(); |
| 540 } | 608 } |
| 541 | 609 |
| 542 | 610 |
| (...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 ASSERT(result); | 1508 ASSERT(result); |
| 1441 } | 1509 } |
| 1442 | 1510 |
| 1443 | 1511 |
| 1444 | 1512 |
| 1445 void Thread::YieldCPU() { | 1513 void Thread::YieldCPU() { |
| 1446 Sleep(0); | 1514 Sleep(0); |
| 1447 } | 1515 } |
| 1448 | 1516 |
| 1449 } } // namespace v8::internal | 1517 } } // namespace v8::internal |
| OLD | NEW |