From fa7339357409a133b25a01bcb13ba093d088e9ce Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Mon, 13 Jan 2020 12:56:13 +0100 Subject: [PATCH] In TaskQueueWin fix race in canceling MutlimediaTimer Bug: webrtc:11232 Change-Id: I371f0b78a572c94f2eefd8e0859eed88bce9e37e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165762 Reviewed-by: Karl Wiberg Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#30232} --- rtc_base/task_queue_win.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rtc_base/task_queue_win.cc b/rtc_base/task_queue_win.cc index dd825d2fdc..8c11b8764a 100644 --- a/rtc_base/task_queue_win.cc +++ b/rtc_base/task_queue_win.cc @@ -134,11 +134,15 @@ class MultimediaTimer { } void Cancel() { - ::ResetEvent(event_); if (timer_id_) { ::timeKillEvent(timer_id_); timer_id_ = 0; } + // Now that timer is killed and not able to set the event, reset the event. + // Doing it in opposite order is racy because event may be set between + // event was reset and timer is killed leaving MultimediaTimer in surprising + // state where both event is set and timer is canceled. + ::ResetEvent(event_); } HANDLE* event_for_wait() { return &event_; }