diff options
author | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-15 19:20:49 +0000 |
---|---|---|
committer | mbelshe@chromium.org <mbelshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-15 19:20:49 +0000 |
commit | 14255a99d1709414d9b5419329e19bf9bd8406b7 (patch) | |
tree | 18616ca60c09839db53690e8c127f5972ca76899 /base/time_win.cc | |
parent | 3f20a2191bdac8e08bc1572913d5aa4a17df930c (diff) | |
download | chromium_src-14255a99d1709414d9b5419329e19bf9bd8406b7.zip chromium_src-14255a99d1709414d9b5419329e19bf9bd8406b7.tar.gz chromium_src-14255a99d1709414d9b5419329e19bf9bd8406b7.tar.bz2 |
Reland old fix that was reverted incorrectly.
Fix regression where high resolution timers could be activated even under
battery power. Add unit test to protect chromium from developers like me
in the future.
The fix is a one-liner in hi_res_timer_manager_win.cc. The rest of the code
change is the mechanics to enable the unit test.
BUG=59528
TEST=HiResTimerManagerTest.ToggleOnOff
Review URL: http://codereview.chromium.org/6904117
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85413 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/time_win.cc')
-rw-r--r-- | base/time_win.cc | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/base/time_win.cc b/base/time_win.cc index 7124a74..d439a1e 100644 --- a/base/time_win.cc +++ b/base/time_win.cc @@ -99,6 +99,7 @@ void InitializeClock() { 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 @@ void Time::EnableHighResolutionTimer(bool enable) { } // 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. |