diff options
-rw-r--r-- | app/app.gyp | 1 | ||||
-rw-r--r-- | app/hi_res_timer_manager.h | 5 | ||||
-rw-r--r-- | app/hi_res_timer_manager_unittest.cc | 51 | ||||
-rw-r--r-- | app/hi_res_timer_manager_win.cc | 5 | ||||
-rw-r--r-- | base/message_loop.cc | 17 | ||||
-rw-r--r-- | base/time.h | 11 | ||||
-rw-r--r-- | base/time_win.cc | 23 |
7 files changed, 11 insertions, 102 deletions
diff --git a/app/app.gyp b/app/app.gyp index 538b73d..2c8e7f7 100644 --- a/app/app.gyp +++ b/app/app.gyp @@ -41,7 +41,6 @@ 'animation_container_unittest.cc', 'animation_unittest.cc', 'clipboard/clipboard_unittest.cc', - 'hi_res_timer_manager_unittest.cc', 'l10n_util_mac_unittest.mm', 'l10n_util_unittest.cc', 'multi_animation_unittest.cc', diff --git a/app/hi_res_timer_manager.h b/app/hi_res_timer_manager.h index fdc10b3..7eed795 100644 --- a/app/hi_res_timer_manager.h +++ b/app/hi_res_timer_manager.h @@ -18,14 +18,11 @@ class HighResolutionTimerManager : public SystemMonitor::PowerObserver { // SystemMonitor::PowerObserver: void OnPowerStateChange(bool on_battery_power); - // Returns true if the hi resolution clock could be used right now. - bool hi_res_clock_available() const { return hi_res_clock_available_; } - private: // Enable or disable the faster multimedia timer. void UseHiResClock(bool use); - bool hi_res_clock_available_; + bool hi_res_clock_used_; DISALLOW_COPY_AND_ASSIGN(HighResolutionTimerManager); }; diff --git a/app/hi_res_timer_manager_unittest.cc b/app/hi_res_timer_manager_unittest.cc deleted file mode 100644 index 1275643..0000000 --- a/app/hi_res_timer_manager_unittest.cc +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "testing/gtest/include/gtest/gtest.h" - -#include "app/hi_res_timer_manager.h" -#include "app/system_monitor.h" -#include "base/time.h" - -#if defined(OS_WIN) -TEST(HiResTimerManagerTest, ToggleOnOff) { - MessageLoop loop; - scoped_ptr<SystemMonitor> system_monitor(new SystemMonitor()); - HighResolutionTimerManager manager; - - // At this point, we don't know if the high resolution timers are on or off, - // it depends on what system the tests are running on (for example, if this - // test is running on a laptop/battery, then the SystemMonitor would have - // already set the PowerState to battery power; but if we're running on a - // desktop, then the PowerState will be non-battery power). Simulate a power - // level change to get to a deterministic state. - manager.OnPowerStateChange(/* on_battery */ false); - - // Loop a few times to test power toggling. - for (int loop = 2; loop >= 0; --loop) { - // The manager has the high resolution clock enabled now. - EXPECT_TRUE(manager.using_hi_res_clock()); - // But the Time class has it off, because it hasn't been activated. - EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse()); - - // Activate the high resolution timer. - base::Time::ActivateHighResolutionTimer(true); - EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse()); - - // Simulate a on-battery power event. - manager.OnPowerStateChange(/* on_battery */ true); - EXPECT_FALSE(manager.using_hi_res_clock()); - EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse()); - - // Simulate a off-battery power event. - manager.OnPowerStateChange(/* on_battery */ false); - EXPECT_TRUE(manager.using_hi_res_clock()); - EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse()); - - // De-activate the high resolution timer. - base::Time::ActivateHighResolutionTimer(false); - } -} -#endif // defined(OS_WIN) - diff --git a/app/hi_res_timer_manager_win.cc b/app/hi_res_timer_manager_win.cc index da25d70..6fbffca 100644 --- a/app/hi_res_timer_manager_win.cc +++ b/app/hi_res_timer_manager_win.cc @@ -7,7 +7,7 @@ #include "base/time.h" HighResolutionTimerManager::HighResolutionTimerManager() - : hi_res_clock_available_(false) { + : hi_res_clock_used_(false) { SystemMonitor* system_monitor = SystemMonitor::Get(); system_monitor->AddObserver(this); UseHiResClock(!system_monitor->BatteryPower()); @@ -23,8 +23,7 @@ void HighResolutionTimerManager::OnPowerStateChange(bool on_battery_power) { } void HighResolutionTimerManager::UseHiResClock(bool use) { - if (use == hi_res_clock_available_) + if (use == hi_res_clock_used_) return; - hi_res_clock_available_ = use; base::Time::EnableHighResolutionTimer(use); } diff --git a/base/message_loop.cc b/base/message_loop.cc index 0b03d3c..8f6c997b 100644 --- a/base/message_loop.cc +++ b/base/message_loop.cc @@ -179,16 +179,6 @@ MessageLoop::~MessageLoop() { // OK, now make it so that no one can find us. lazy_tls_ptr.Pointer()->Set(NULL); - -#if defined(OS_WIN) - // If we left the high-resolution timer activated, deactivate it now. - // Doing this is not-critical, it is mainly to make sure we track - // the high resolution timer activations properly in our unit tests. - if (!high_resolution_timer_expiration_.is_null()) { - Time::ActivateHighResolutionTimer(false); - high_resolution_timer_expiration_ = base::TimeTicks(); - } -#endif } void MessageLoop::AddDestructionObserver( @@ -347,10 +337,9 @@ void MessageLoop::PostTask_Helper( bool needs_high_res_timers = delay_ms < (2 * Time::kMinLowResolutionThresholdMs); if (needs_high_res_timers) { - if (Time::ActivateHighResolutionTimer(true)) { - high_resolution_timer_expiration_ = base::TimeTicks::Now() + - TimeDelta::FromMilliseconds(kHighResolutionTimerModeLeaseTimeMs); - } + Time::ActivateHighResolutionTimer(true); + high_resolution_timer_expiration_ = base::TimeTicks::Now() + + TimeDelta::FromMilliseconds(kHighResolutionTimerModeLeaseTimeMs); } } #endif diff --git a/base/time.h b/base/time.h index 305ca6b..79e30b4 100644 --- a/base/time.h +++ b/base/time.h @@ -283,16 +283,10 @@ class Time { // Activates or deactivates the high resolution timer based on the |activate| // flag. If the HighResolutionTimer is not Enabled (see // EnableHighResolutionTimer), this function will return false. Otherwise - // returns true. Each successful activate call must be paired with a - // subsequent deactivate call. + // returns true. // All callers to activate the high resolution timer must eventually call // this function to deactivate the high resolution timer. static bool ActivateHighResolutionTimer(bool activate); - - // Returns true if the high resolution timer is both enabled and activated. - // This is provided for testing only, and is not tracked in a thread-safe - // way. - static bool IsHighResolutionTimerInUse(); #endif // Converts an exploded structure representing either the local time or UTC @@ -411,9 +405,6 @@ class Time { // when using battery power, we might elect to prevent high speed timers // which would draw more power. static bool high_resolution_timer_enabled_; - // Count of activations on the high resolution timer. Only use in tests - // which are single threaded. - static int high_resolution_timer_activated_; #endif // Time in microseconds in UTC. diff --git a/base/time_win.cc b/base/time_win.cc index 502dd83..5d3ecd6 100644 --- a/base/time_win.cc +++ b/base/time_win.cc @@ -99,7 +99,6 @@ 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() { @@ -163,36 +162,22 @@ void Time::EnableHighResolutionTimer(bool enable) { } // static -bool Time::ActivateHighResolutionTimer(bool activating) { - if (!high_resolution_timer_enabled_ && activating) +bool Time::ActivateHighResolutionTimer(bool activate) { + if (!high_resolution_timer_enabled_) return false; // Using anything other than 1ms makes timers granular // to that interval. const int kMinTimerIntervalMs = 1; MMRESULT result; - if (activating) { + if (activate) result = timeBeginPeriod(kMinTimerIntervalMs); - high_resolution_timer_activated_++; - } else { + 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. |