From 5bdee47ede2f21768db9f1d79504c8713b121331 Mon Sep 17 00:00:00 2001 From: tommi Date: Fri, 3 Mar 2017 05:20:12 -0800 Subject: [PATCH] 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} --- webrtc/base/task_queue_unittest.cc | 2 +- webrtc/base/task_queue_win.cc | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/webrtc/base/task_queue_unittest.cc b/webrtc/base/task_queue_unittest.cc index c5faf8f5dc..432a0d5579 100644 --- a/webrtc/base/task_queue_unittest.cc +++ b/webrtc/base/task_queue_unittest.cc @@ -102,7 +102,7 @@ TEST(TaskQueueTest, PostFromQueue) { 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 5850b2947e..bbaf7b9f44 100644 --- a/webrtc/base/task_queue_win.cc +++ b/webrtc/base/task_queue_win.cc @@ -66,6 +66,17 @@ ThreadPriority TaskQueuePriorityToThreadPriority(Priority priority) { } 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 @@ void TaskQueue::PostDelayedTask(std::unique_ptr task, // 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(::GetTickCount()) << 32) | milliseconds; + wparam = (static_cast(GetTick()) << 32) | milliseconds; #else wparam = milliseconds; #endif @@ -325,7 +336,7 @@ bool TaskQueue::ProcessQueuedMessages(DelayedTasks* delayed_tasks, 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;