Index: base/process/process_metrics.cc |
diff --git a/base/process/process_metrics.cc b/base/process/process_metrics.cc |
index 3465d5782c38e501d5f48d126038e627d54c6eb9..90baae5051c73379308c1effbd3226fab052332d 100644 |
--- a/base/process/process_metrics.cc |
+++ b/base/process/process_metrics.cc |
@@ -51,11 +51,37 @@ double ProcessMetrics::GetPlatformIndependentCPUUsage() { |
#endif |
} |
-#if !defined(OS_MACOSX) |
+#if defined(OS_MACOSX) || defined(OS_LINUX) |
+int ProcessMetrics::CalculateIdleWakeupsPerSecond( |
+ uint64 absolute_idle_wakeups) { |
+ TimeTicks time = TimeTicks::Now(); |
+ |
+ if (last_absolute_idle_wakeups_ == 0) { |
+ // First call, just set the last values. |
+ last_idle_wakeups_time_ = time; |
+ last_absolute_idle_wakeups_ = absolute_idle_wakeups; |
+ return 0; |
+ } |
+ |
+ int64 wakeups_delta = absolute_idle_wakeups - last_absolute_idle_wakeups_; |
+ int64 time_delta = (time - last_idle_wakeups_time_).InMicroseconds(); |
+ if (time_delta == 0) { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ |
+ last_idle_wakeups_time_ = time; |
+ last_absolute_idle_wakeups_ = absolute_idle_wakeups; |
+ |
+ // Round to average wakeups per second. |
+ int64 wakeups_delta_for_ms = wakeups_delta * Time::kMicrosecondsPerSecond; |
+ return (wakeups_delta_for_ms + time_delta / 2) / time_delta; |
+} |
+#else |
int ProcessMetrics::GetIdleWakeupsPerSecond() { |
NOTIMPLEMENTED(); // http://crbug.com/120488 |
return 0; |
} |
-#endif // !defined(OS_MACOSX) |
+#endif // defined(OS_MACOSX) || defined(OS_LINUX) |
} // namespace base |