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.