all repos — mgba @ d270a42de8c19c73ef1eeaca165b458673139260

mGBA Game Boy Advance Emulator

Core: Fix race condition initializing thread proxy
Vicki Pfau vi@endrift.com
Fri, 31 Jan 2020 18:06:18 -0800
commit

d270a42de8c19c73ef1eeaca165b458673139260

parent

b922cecc61b6b1f1d191a9cc1bba0f1dac10520b

2 files changed, 6 insertions(+), 2 deletions(-)

jump to
M CHANGESCHANGES

@@ -14,6 +14,7 @@ - GBA Video: Fix Hblank timing

- 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: Force OpenGL paint engine creation thread (fixes mgba.io/i/1642)
M src/feature/thread-proxy.csrc/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 @@ struct mVideoThreadProxy* proxyRenderer = 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) {