From 9c40a7976b9de6b19017efc634093f0ad9cc901f Mon Sep 17 00:00:00 2001 From: Dentomologist Date: Thu, 24 Apr 2025 14:02:10 -0700 Subject: [PATCH] AchievementManager: Remove ConfigChangedCallback on shutdown Prevent SetHardcoreMode from being called after m_client is set to nullptr. rc_client_set_hardcore_enabled() checks for nullptr so this didn't cause any problems, but better not to rely on that. Also prevents multiple SetHardcoreMode callbacks from piling up when repeatedly toggling Config::RA_ENABLED. --- Source/Core/Core/AchievementManager.cpp | 3 ++- Source/Core/Core/AchievementManager.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index a13862ab3c..8d08f71934 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -76,7 +76,7 @@ void AchievementManager::Init(void* hwnd) [](const char* message, const rc_client_t* client) { INFO_LOG_FMT(ACHIEVEMENTS, "{}", message); }); - Config::AddConfigChangedCallback([this] { SetHardcoreMode(); }); + m_config_changed_callback_id = Config::AddConfigChangedCallback([this] { SetHardcoreMode(); }); SetHardcoreMode(); m_queue.Reset("AchievementManagerQueue", [](const std::function& func) { func(); }); m_image_queue.Reset("AchievementManagerImageQueue", @@ -764,6 +764,7 @@ void AchievementManager::Shutdown() { CloseGame(); m_queue.Shutdown(); + Config::RemoveConfigChangedCallback(m_config_changed_callback_id); std::lock_guard lg{m_lock}; // DON'T log out - keep those credentials for next run. rc_client_destroy(m_client); diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 3c09a87d1b..b1cfa460cf 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -26,6 +26,7 @@ #include #include "Common/CommonTypes.h" +#include "Common/Config/Config.h" #include "Common/Event.h" #include "Common/HttpRequest.h" #include "Common/JsonUtil.h" @@ -264,6 +265,7 @@ private: bool m_is_runtime_initialized = false; UpdateCallback m_update_callback = [](const UpdatedItems&) {}; std::unique_ptr m_loading_volume; + Config::ConfigChangedCallbackID m_config_changed_callback_id; Badge m_default_player_badge; Badge m_default_game_badge; Badge m_default_unlocked_badge;