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}
This commit is contained in:
tommi 2017-03-03 05:20:12 -08:00 committed by Commit bot
parent 9a59473f2c
commit 5bdee47ede
2 changed files with 14 additions and 3 deletions

View File

@ -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);

View File

@ -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<QueuedTask> 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<WPARAM>(::GetTickCount()) << 32) | milliseconds;
wparam = (static_cast<WPARAM>(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;