| Index: base/timer/hi_res_timer_manager_win.cc
|
| diff --git a/base/timer/hi_res_timer_manager_win.cc b/base/timer/hi_res_timer_manager_win.cc
|
| index 692f72b4e594481897bf022e256d51bb65b1f1b9..5474373e1bd935129bde3c1dcf11a6d132205d8e 100644
|
| --- a/base/timer/hi_res_timer_manager_win.cc
|
| +++ b/base/timer/hi_res_timer_manager_win.cc
|
| @@ -4,21 +4,44 @@
|
|
|
| #include "base/timer/hi_res_timer_manager.h"
|
|
|
| +#include <algorithm>
|
| +
|
| +#include "base/atomicops.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/power_monitor/power_monitor.h"
|
| +#include "base/task_scheduler/post_task.h"
|
| #include "base/time/time.h"
|
|
|
| namespace base {
|
|
|
| +namespace {
|
| +
|
| +constexpr TimeDelta kUsageSampleInterval = TimeDelta::FromMinutes(10);
|
| +
|
| +void ReportHighResolutionTimerUsage() {
|
| + UMA_HISTOGRAM_PERCENTAGE("Windows.HighResolutionTimerUsage",
|
| + Time::GetHighResolutionTimerUsage());
|
| + // Reset usage for the next interval.
|
| + Time::ResetHighResolutionTimerUsage();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| HighResolutionTimerManager::HighResolutionTimerManager()
|
| : hi_res_clock_available_(false) {
|
| - base::PowerMonitor* power_monitor = base::PowerMonitor::Get();
|
| + PowerMonitor* power_monitor = PowerMonitor::Get();
|
| DCHECK(power_monitor != NULL);
|
| power_monitor->AddObserver(this);
|
| UseHiResClock(!power_monitor->IsOnBatteryPower());
|
| +
|
| + // Start polling the high resolution timer usage.
|
| + Time::ResetHighResolutionTimerUsage();
|
| + timer_.Start(FROM_HERE, kUsageSampleInterval,
|
| + Bind(&ReportHighResolutionTimerUsage));
|
| }
|
|
|
| HighResolutionTimerManager::~HighResolutionTimerManager() {
|
| - base::PowerMonitor::Get()->RemoveObserver(this);
|
| + PowerMonitor::Get()->RemoveObserver(this);
|
| UseHiResClock(false);
|
| }
|
|
|
| @@ -26,11 +49,22 @@ void HighResolutionTimerManager::OnPowerStateChange(bool on_battery_power) {
|
| UseHiResClock(!on_battery_power);
|
| }
|
|
|
| +void HighResolutionTimerManager::OnSuspend() {
|
| + // Stop polling the usage to avoid including the standby time.
|
| + timer_.Stop();
|
| +}
|
| +
|
| +void HighResolutionTimerManager::OnResume() {
|
| + // Resume polling the usage.
|
| + Time::ResetHighResolutionTimerUsage();
|
| + timer_.Reset();
|
| +}
|
| +
|
| void HighResolutionTimerManager::UseHiResClock(bool use) {
|
| if (use == hi_res_clock_available_)
|
| return;
|
| hi_res_clock_available_ = use;
|
| - base::Time::EnableHighResolutionTimer(use);
|
| + Time::EnableHighResolutionTimer(use);
|
| }
|
|
|
| } // namespace base
|
|
|