Index: content/renderer/devtools/devtools_cpu_throttler.cc |
diff --git a/content/renderer/devtools/devtools_cpu_throttler.cc b/content/renderer/devtools/devtools_cpu_throttler.cc |
index 68f37d052523721509ef0078c7bd89af33ed6fa8..277d863492523b8bacdac0771bc5521dbefb75a2 100644 |
--- a/content/renderer/devtools/devtools_cpu_throttler.cc |
+++ b/content/renderer/devtools/devtools_cpu_throttler.cc |
@@ -12,7 +12,7 @@ |
#if defined(OS_POSIX) |
#include <signal.h> |
-#define USE_SIGNALS |
+#define USE_SIGNALS 1 |
#endif |
using base::subtle::Atomic32; |
@@ -37,6 +37,7 @@ class CPUThrottlingThread final : public base::PlatformThread::Delegate { |
static void SuspendThread(base::PlatformThreadHandle thread_handle); |
static void ResumeThread(base::PlatformThreadHandle thread_handle); |
+ static void Sleep(base::TimeDelta duration); |
#ifdef USE_SIGNALS |
void InstallSignalHandler(); |
@@ -122,29 +123,46 @@ void CPUThrottlingThread::HandleSignal(int signal) { |
// static |
void CPUThrottlingThread::SuspendThread( |
base::PlatformThreadHandle thread_handle) { |
-#ifdef USE_SIGNALS |
+#if defined(USE_SIGNALS) |
Release_Store(&suspended_, 1); |
pthread_kill(thread_handle.platform_handle(), SIGUSR2); |
+#elif defined(OS_WIN) |
+ ::SuspendThread(thread_handle.platform_handle()); |
#endif |
} |
// static |
void CPUThrottlingThread::ResumeThread( |
base::PlatformThreadHandle thread_handle) { |
-#ifdef USE_SIGNALS |
+#if defined(USE_SIGNALS) |
Release_Store(&suspended_, 0); |
+#elif defined(OS_WIN) |
+ ::ResumeThread(thread_handle.platform_handle()); |
#endif |
} |
void CPUThrottlingThread::Start() { |
#ifdef USE_SIGNALS |
InstallSignalHandler(); |
+#elif !defined(OS_WIN) |
+ LOG(ERROR) << "CPU throttling is not supported." |
#endif |
if (!base::PlatformThread::Create(0, this, &throttling_thread_handle_)) { |
LOG(ERROR) << "Failed to create throttling thread."; |
} |
} |
+void CPUThrottlingThread::Sleep(base::TimeDelta duration) { |
+#if defined(OS_WIN) |
+ // We cannot rely on ::Sleep function as it's precision is not enough for |
+ // the purpose. Could be up to 16ms jitter. |
+ base::TimeTicks wakeup_time = base::TimeTicks::Now() + duration; |
+ while (base::TimeTicks::Now() < wakeup_time) {} |
+#else |
+ base::PlatformThread::Sleep(duration); |
+#endif |
+} |
+ |
void CPUThrottlingThread::Stop() { |
cancellation_flag_.Set(); |
base::PlatformThread::Join(throttling_thread_handle_); |
@@ -160,9 +178,9 @@ void CPUThrottlingThread::Throttle() { |
base::TimeDelta::FromMicroseconds(static_cast<int>(quant_time_us / rate)); |
base::TimeDelta sleep_duration = |
base::TimeDelta::FromMicroseconds(quant_time_us) - run_duration; |
- base::PlatformThread::Sleep(run_duration); |
+ Sleep(run_duration); |
SuspendThread(throttled_thread_handle_); |
- base::PlatformThread::Sleep(sleep_duration); |
+ Sleep(sleep_duration); |
ResumeThread(throttled_thread_handle_); |
} |