From b1b2c91eb3fce4aa1423ad0cf0ca846b2daea4c7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 6 Jul 2014 14:02:00 -0700 Subject: [PATCH] Fix issues on win32 with multithreading. We weren't properly rechecking based on spurious wakeups (which technically can happen on x64 too.) --- Core/ThreadEventQueue.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Core/ThreadEventQueue.h b/Core/ThreadEventQueue.h index 3fdc0d043a..cddfa69852 100644 --- a/Core/ThreadEventQueue.h +++ b/Core/ThreadEventQueue.h @@ -75,9 +75,13 @@ struct ThreadEventQueue : public B { eventsHaveRun_ = true; do { - if (!HasEvents()) { + while (!HasEvents() && !ShouldExitEventLoop() && threadEnabled_) { eventsWait_.wait(eventsLock_); } + // Quit the loop if the queue is drained and coreState has tripped, or threading is disabled. + if (!HasEvents()) { + break; + } for (Event ev = GetNextEvent(); EventType(ev) != EVENT_INVALID; ev = GetNextEvent()) { eventsLock_.unlock(); @@ -95,11 +99,6 @@ struct ThreadEventQueue : public B { } eventsLock_.lock(); } - - // Quit the loop if the queue is drained and coreState has tripped, or threading is disabled. - if (ShouldExitEventLoop() || !threadEnabled_) { - break; - } } while (CoreTiming::GetTicks() < globalticks); // This will force the waiter to check coreState, even if we didn't actually drain.