diff options
| author | Stenzek <stenzek@gmail.com> | 2017-10-10 23:52:17 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2017-10-10 23:56:33 +1000 |
| commit | edb5f855c28013e2782132251abd94bf1d040c13 (patch) | |
| tree | a4f01a66c9769e895429e4611ac871af2b78b83a /Source/Core/VideoCommon/VideoConfig.cpp | |
| parent | 1a4883ac5afd81ec3c6eb0795968d9ccef8c32f4 (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.cpp | 7 |
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; } |
