From 541715008bea659104a1705caa69a7bfd3f36637 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 22 Jan 2020 18:22:25 -0800 Subject: [PATCH] Qt: Fix race condition with proxied video events --- CHANGES | 1 + src/feature/thread-proxy.c | 1 + src/platform/qt/VideoProxy.cpp | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f78fd6a24..6c06fad42 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 0.9.0: (Future) Other fixes: - Qt: Only dynamically reset video scale if a game is running + - Qt: Fix race condition with proxied video events 0.8.0: (2020-01-21) Features: diff --git a/src/feature/thread-proxy.c b/src/feature/thread-proxy.c index 29a3161e7..ba1785c46 100644 --- a/src/feature/thread-proxy.c +++ b/src/feature/thread-proxy.c @@ -138,6 +138,7 @@ static void _postEvent(struct mVideoLogger* logger, enum mVideoLoggerEvent event MutexLock(&proxyRenderer->mutex); proxyRenderer->event = event; ConditionWake(&proxyRenderer->toThreadCond); + ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); MutexUnlock(&proxyRenderer->mutex); } diff --git a/src/platform/qt/VideoProxy.cpp b/src/platform/qt/VideoProxy.cpp index 431de4d26..8a89ea533 100644 --- a/src/platform/qt/VideoProxy.cpp +++ b/src/platform/qt/VideoProxy.cpp @@ -7,6 +7,8 @@ #include "CoreController.h" +#include + using namespace QGBA; VideoProxy::VideoProxy() { @@ -81,11 +83,22 @@ bool VideoProxy::readData(void* data, size_t length, bool block) { } void VideoProxy::postEvent(enum mVideoLoggerEvent event) { - emit eventPosted(event); + if (QThread::currentThread() == thread()) { + // We're on the main thread + emit eventPosted(event); + } else { + m_mutex.lock(); + emit eventPosted(event); + m_fromThreadCond.wait(&m_mutex, 1); + m_mutex.unlock(); + } } void VideoProxy::handleEvent(int event) { + m_mutex.lock(); m_logger.d.handleEvent(&m_logger.d, static_cast(event)); + m_fromThreadCond.wakeAll(); + m_mutex.unlock(); } void VideoProxy::lock() {