High resolution timer fix reland
On Windows the message pump code tried to manage the systemwide timer
resolution to fire delayed tasks with better than 15ms resolution but
it is buggy.
This is https://codereview.chromium.org/395913006
please see that review for rationale.
BUG=153139
TBR=jamesr,darin
TEST=included, also see bug for manual verification.
Review URL: https://codereview.chromium.org/509223002
Cr-Commit-Position: refs/heads/master@{#292493}
CrOS-Libchrome-Original-Commit: ee89079586f3a1ad727aad4c6aaf3100e220d6e4
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index 39a1b68..8db1e77 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -371,10 +371,6 @@
void AddTaskObserver(TaskObserver* task_observer);
void RemoveTaskObserver(TaskObserver* task_observer);
- // When we go into high resolution timer mode, we will stay in hi-res mode
- // for at least 1s.
- static const int kHighResolutionTimerModeLeaseTimeMs = 1000;
-
#if defined(OS_WIN)
void set_os_modal_loop(bool os_modal_loop) {
os_modal_loop_ = os_modal_loop;
@@ -390,7 +386,7 @@
// Returns true if the message loop has high resolution timers enabled.
// Provided for testing.
- bool IsHighResolutionTimerEnabledForTesting();
+ bool HasHighResolutionTasks();
// Returns true if the message loop is "idle". Provided for testing.
bool IsIdleForTesting();
@@ -459,6 +455,14 @@
// this queue is only accessed (push/pop) by our current thread.
TaskQueue work_queue_;
+ // How many high resolution tasks are in the pending task queue. This value
+ // increases by N every time we call ReloadWorkQueue() and decreases by 1
+ // every time we call RunTask() if the task needs a high resolution timer.
+ int pending_high_res_tasks_;
+ // Tracks if we have requested high resolution timers. Its only use is to
+ // turn off the high resolution timer upon loop destruction.
+ bool in_high_res_mode_;
+
// Contains delayed tasks, sorted by their 'delayed_run_time' property.
DelayedTaskQueue delayed_work_queue_;