Index: base/time_win.cc |
=================================================================== |
--- base/time_win.cc (revision 62903) |
+++ base/time_win.cc (working copy) |
@@ -99,6 +99,7 @@ |
const int64 Time::kTimeTToMicrosecondsOffset = GG_INT64_C(11644473600000000); |
bool Time::high_resolution_timer_enabled_ = false; |
+int Time::high_resolution_timer_activated_ = 0; |
// static |
Time Time::Now() { |
@@ -162,22 +163,36 @@ |
} |
// static |
-bool Time::ActivateHighResolutionTimer(bool activate) { |
- if (!high_resolution_timer_enabled_) |
+bool Time::ActivateHighResolutionTimer(bool activating) { |
+ if (!high_resolution_timer_enabled_ && activating) |
return false; |
// Using anything other than 1ms makes timers granular |
// to that interval. |
const int kMinTimerIntervalMs = 1; |
MMRESULT result; |
- if (activate) |
+ if (activating) { |
result = timeBeginPeriod(kMinTimerIntervalMs); |
- else |
+ high_resolution_timer_activated_++; |
+ } else { |
result = timeEndPeriod(kMinTimerIntervalMs); |
+ high_resolution_timer_activated_--; |
+ } |
return result == TIMERR_NOERROR; |
} |
// static |
+bool Time::IsHighResolutionTimerInUse() { |
+ // Note: we should track the high_resolution_timer_activated_ value |
+ // under a lock if we want it to be accurate in a system with multiple |
+ // message loops. We don't do that - because we don't want to take the |
+ // expense of a lock for this. We *only* track this value so that unit |
+ // tests can see if the high resolution timer is on or off. |
+ return high_resolution_timer_enabled_ && |
+ high_resolution_timer_activated_ > 0; |
+} |
+ |
+// static |
Time Time::FromExploded(bool is_local, const Exploded& exploded) { |
// Create the system struct representing our exploded time. It will either be |
// in local time or UTC. |