Increase tick precision in TaskQueue on Windows 64.
Hopefully this will reduce the flakiness of PostDelayedTask.
BUG=none
Review-Url: https://codereview.webrtc.org/2728663008
Cr-Commit-Position: refs/heads/master@{#17001}
diff --git a/webrtc/base/task_queue_unittest.cc b/webrtc/base/task_queue_unittest.cc
index c5faf8f..432a0d5 100644
--- a/webrtc/base/task_queue_unittest.cc
+++ b/webrtc/base/task_queue_unittest.cc
@@ -102,7 +102,7 @@
TEST(TaskQueueTest, PostDelayed) {
static const char kQueueName[] = "PostDelayed";
Event event(false, false);
- TaskQueue queue(kQueueName);
+ TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH);
uint32_t start = Time();
queue.PostDelayedTask(Bind(&CheckCurrent, kQueueName, &event, &queue), 100);
diff --git a/webrtc/base/task_queue_win.cc b/webrtc/base/task_queue_win.cc
index 5850b29..bbaf7b9 100644
--- a/webrtc/base/task_queue_win.cc
+++ b/webrtc/base/task_queue_win.cc
@@ -66,6 +66,17 @@
}
return kNormalPriority;
}
+
+#if defined(_WIN64)
+DWORD GetTick() {
+ static const UINT kPeriod = 1;
+ bool high_res = (timeBeginPeriod(kPeriod) == TIMERR_NOERROR);
+ DWORD ret = timeGetTime();
+ if (high_res)
+ timeEndPeriod(kPeriod);
+ return ret;
+}
+#endif
} // namespace
class TaskQueue::MultimediaTimer {
@@ -214,7 +225,7 @@
// GetTickCount() returns a fairly coarse tick count (resolution or about 8ms)
// so this compensation isn't that accurate, but since we have unused 32 bits
// on Win64, we might as well use them.
- wparam = (static_cast<WPARAM>(::GetTickCount()) << 32) | milliseconds;
+ wparam = (static_cast<WPARAM>(GetTick()) << 32) | milliseconds;
#else
wparam = milliseconds;
#endif
@@ -325,7 +336,7 @@
uint32_t milliseconds = msg.wParam & 0xFFFFFFFF;
#if defined(_WIN64)
// Subtract the time it took to queue the timer.
- const DWORD now = GetTickCount();
+ const DWORD now = GetTick();
DWORD post_time = now - (msg.wParam >> 32);
milliseconds =
post_time > milliseconds ? 0 : milliseconds - post_time;