From edb5f855c28013e2782132251abd94bf1d040c13 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 10 Oct 2017 23:52:17 +1000 Subject: 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. --- Source/Core/VideoCommon/VideoConfig.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/VideoConfig.cpp') 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; } -- cgit v1.2.3