Index: webrtc/base/task_queue_win.cc |
diff --git a/webrtc/base/task_queue_win.cc b/webrtc/base/task_queue_win.cc |
index e18c1f7a42c8f78d30917d6256875d79ece72eed..92f0f62a3c1736c75dcd7c12e3e690b53ccc2c53 100644 |
--- a/webrtc/base/task_queue_win.cc |
+++ b/webrtc/base/task_queue_win.cc |
@@ -11,7 +11,6 @@ |
#include "webrtc/base/task_queue.h" |
#include <string.h> |
-#include <unordered_map> |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
@@ -132,12 +131,26 @@ void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task, |
// static |
bool TaskQueue::ThreadMain(void* context) { |
- std::unordered_map<UINT_PTR, std::unique_ptr<QueuedTask>> delayed_tasks; |
- |
- BOOL ret; |
- MSG msg; |
+ DelayedTasks delayed_tasks; |
+ while (true) { |
+ DWORD result = ::MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, |
+ QS_ALLINPUT, MWMO_ALERTABLE); |
+ RTC_CHECK_NE(WAIT_FAILED, result); |
+ if (result == WAIT_OBJECT_0) { |
+ if (!ProcessQueuedMessages(&delayed_tasks)) |
+ break; |
+ } else { |
+ RTC_DCHECK_EQ(WAIT_IO_COMPLETION, result); |
+ } |
+ } |
+ return false; |
+} |
- while ((ret = GetMessage(&msg, nullptr, 0, 0)) != 0 && ret != -1) { |
+// static |
+bool TaskQueue::ProcessQueuedMessages(DelayedTasks* delayed_tasks) { |
+ MSG msg = {}; |
+ while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE) && |
+ msg.message != WM_QUIT) { |
if (!msg.hwnd) { |
switch (msg.message) { |
case WM_RUN_TASK: { |
@@ -157,16 +170,16 @@ bool TaskQueue::ThreadMain(void* context) { |
post_time > milliseconds ? 0 : milliseconds - post_time; |
#endif |
UINT_PTR timer_id = SetTimer(nullptr, 0, milliseconds, nullptr); |
- delayed_tasks.insert(std::make_pair(timer_id, task)); |
+ delayed_tasks->insert(std::make_pair(timer_id, task)); |
break; |
} |
case WM_TIMER: { |
KillTimer(nullptr, msg.wParam); |
- auto found = delayed_tasks.find(msg.wParam); |
- RTC_DCHECK(found != delayed_tasks.end()); |
+ auto found = delayed_tasks->find(msg.wParam); |
+ RTC_DCHECK(found != delayed_tasks->end()); |
if (!found->second->Run()) |
found->second.release(); |
- delayed_tasks.erase(found); |
+ delayed_tasks->erase(found); |
break; |
} |
default: |
@@ -178,7 +191,7 @@ bool TaskQueue::ThreadMain(void* context) { |
DispatchMessage(&msg); |
} |
} |
- |
- return false; |
+ return msg.message != WM_QUIT; |
} |
+ |
} // namespace rtc |