diff --git a/CHANGES b/CHANGES index 1541ae938..453f28f0e 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Emulation fixes: - GBA Video: Fix backdrop blending on lines without sprites (fixes mgba.io/i/1647) - GBA Video: Fix OpenGL sprite flag priority Other fixes: + - Core: Fix race condition initializing thread proxy - Qt: Only dynamically reset video scale if a game is running - Qt: Fix race condition with proxied video events - Qt: Fix color selection in asset view (fixes mgba.io/i/1648) diff --git a/src/feature/thread-proxy.c b/src/feature/thread-proxy.c index ba1785c46..d99e81066 100644 --- a/src/feature/thread-proxy.c +++ b/src/feature/thread-proxy.c @@ -137,8 +137,10 @@ static void _postEvent(struct mVideoLogger* logger, enum mVideoLoggerEvent event struct mVideoThreadProxy* proxyRenderer = (struct mVideoThreadProxy*) logger; MutexLock(&proxyRenderer->mutex); proxyRenderer->event = event; - ConditionWake(&proxyRenderer->toThreadCond); - ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); + while (proxyRenderer->event) { + ConditionWake(&proxyRenderer->toThreadCond); + ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); + } MutexUnlock(&proxyRenderer->mutex); } @@ -179,6 +181,7 @@ static THREAD_ENTRY _proxyThread(void* logger) { ThreadSetName("Proxy Renderer Thread"); MutexLock(&proxyRenderer->mutex); + ConditionWake(&proxyRenderer->fromThreadCond); while (proxyRenderer->threadState != PROXY_THREAD_STOPPED) { ConditionWait(&proxyRenderer->toThreadCond, &proxyRenderer->mutex); if (proxyRenderer->threadState == PROXY_THREAD_STOPPED) {