From e6057c5f62ed43d445416517913f44f06673d44e Mon Sep 17 00:00:00 2001 From: Filippo Tarpini Date: Wed, 24 Mar 2021 21:53:37 +0200 Subject: [PATCH] Qt: avoid queuing ConfigChanged() more than once --- Source/Core/DolphinQt/Settings.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index d448ca0abf..16e931065a 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -4,6 +4,8 @@ #include "DolphinQt/Settings.h" +#include + #include #include #include @@ -41,8 +43,21 @@ Settings::Settings() QueueOnObject(this, [this, new_state] { emit EmulationStateChanged(new_state); }); }); - Config::AddConfigChangedCallback( - [this] { QueueOnObject(this, [this] { emit ConfigChanged(); }); }); + Config::AddConfigChangedCallback([this] { + static std::atomic do_once{true}; + if (do_once.exchange(false)) + { + // Calling ConfigChanged() with a "delay" can have risks, for example, if from + // code we change some configs that result in Qt greying out some setting, we could + // end up editing that setting before its greyed out, sending out an event, + // which might not be expected or handled by the code, potentially crashing. + // The only safe option would be to wait on the Qt thread to have finished executing this. + QueueOnObject(this, [this] { + do_once = true; + emit ConfigChanged(); + }); + } + }); g_controller_interface.RegisterDevicesChangedCallback( [this] { QueueOnObject(this, [this] { emit DevicesChanged(); }); });