Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Side by Side Diff: src/platform-win32.cc

Issue 24529002: Revert OS::TimeCurrentMillis on Windows introduced in r16413. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/timer.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/timer.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698