Core: Fix race condition initializing thread proxy
Vicki Pfau vi@endrift.com
Fri, 31 Jan 2020 18:06:18 -0800
2 files changed,
6 insertions(+),
2 deletions(-)
M
CHANGES
→
CHANGES
@@ -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.c
→
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 @@ 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) {