summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VideoConfig.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-10-10 23:52:17 +1000
committerStenzek <stenzek@gmail.com>2017-10-10 23:56:33 +1000
commitedb5f855c28013e2782132251abd94bf1d040c13 (patch)
treea4f01a66c9769e895429e4611ac871af2b78b83a /Source/Core/VideoCommon/VideoConfig.cpp
parent1a4883ac5afd81ec3c6eb0795968d9ccef8c32f4 (diff)
VideoConfig: Prevent race condition on g_Config when refreshing
There was a race condition between the video thread and the host thread, if corrections need to be made by VerifyValidity(). Briefly, the config will contain invalid values. Instead, pause emulation first, which will flush the video thread, update the config and correct it, then resume emulation, after which the video thread will detect the config has changed and act accordingly.
Diffstat (limited to 'Source/Core/VideoCommon/VideoConfig.cpp')
-rw-r--r--Source/Core/VideoCommon/VideoConfig.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp
index d4097e5669..f561f94d37 100644
--- a/Source/Core/VideoCommon/VideoConfig.cpp
+++ b/Source/Core/VideoCommon/VideoConfig.cpp
@@ -48,7 +48,12 @@ void VideoConfig::Refresh()
{
if (!s_has_registered_callback)
{
- Config::AddConfigChangedCallback([]() { g_Config.Refresh(); });
+ // There was a race condition between the video thread and the host thread here, if
+ // corrections need to be made by VerifyValidity(). Briefly, the config will contain
+ // invalid values. Instead, pause emulation first, which will flush the video thread,
+ // update the config and correct it, then resume emulation, after which the video
+ // thread will detect the config has changed and act accordingly.
+ Config::AddConfigChangedCallback([]() { Core::RunAsCPUThread([]() { g_Config.Refresh(); }); });
s_has_registered_callback = true;
}