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

Unified Diff: base/timer/hi_res_timer_manager_win.cc

Issue 2951413003: Add UMA for High Resolution Timer Usage (Closed)
Patch Set: Added suspend / resume logic Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
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..286b4007c4ed93c3890ddc18f7ea83ba4e5f89e4 100644
--- a/base/timer/hi_res_timer_manager_win.cc
+++ b/base/timer/hi_res_timer_manager_win.cc
@@ -4,21 +4,61 @@
#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);
+
+subtle::Atomic32 g_report_id = 0;
+
+// Forward declaration.
+void MaybeReportHighResolutionTimerUsageAndReschedule(int report_id);
+
+void ScheduleHighResolutionTimerUsageReport() {
+ Time::ResetHighResolutionTimerUsage();
+ int next_report_id = subtle::NoBarrier_AtomicIncrement(&g_report_id, 1);
+ PostDelayedTaskWithTraits(
+ FROM_HERE,
+ {TaskPriority::BACKGROUND, TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ Bind(&MaybeReportHighResolutionTimerUsageAndReschedule, next_report_id),
+ kUsageSampleInterval);
+}
+
+void ReportHighResolutionTimerUsage() {
+ UMA_HISTOGRAM_PERCENTAGE("Windows.HighResolutionTimerUsage",
+ Time::GetHighResolutionTimerUsage());
+}
+
+void MaybeReportHighResolutionTimerUsageAndReschedule(int report_id) {
+ if (report_id != subtle::NoBarrier_Load(&g_report_id))
+ return;
+
+ ReportHighResolutionTimerUsage();
+ ScheduleHighResolutionTimerUsageReport();
+}
+
+} // 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());
+ ScheduleHighResolutionTimerUsageReport();
}
HighResolutionTimerManager::~HighResolutionTimerManager() {
- base::PowerMonitor::Get()->RemoveObserver(this);
+ PowerMonitor::Get()->RemoveObserver(this);
UseHiResClock(false);
}
@@ -26,11 +66,21 @@ void HighResolutionTimerManager::OnPowerStateChange(bool on_battery_power) {
UseHiResClock(!on_battery_power);
}
+void HighResolutionTimerManager::OnSuspend() {
+ // Skip to next report id to prevent a queued usage report from being logged
+ // on resume and including the standby time.
+ subtle::NoBarrier_AtomicIncrement(&g_report_id, 1);
+}
+
+void HighResolutionTimerManager::OnResume() {
+ ScheduleHighResolutionTimerUsageReport();
gab 2017/06/28 16:39:33 It's possible that the task fired from here runs a
stanisc 2017/06/28 22:28:35 report_id was supposed to protect from running con
gab 2017/07/01 06:55:30 FWIW atomics merely provide eventual consistency s
+}
+
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

Powered by Google App Engine
This is Rietveld 408576698