diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index b5eec09d47..7a1837abbc 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -72,7 +72,7 @@ void AchievementManager::Init() } } -void AchievementManager::LoadApprovedList() +picojson::value AchievementManager::LoadApprovedList() { picojson::value temp; std::string error; @@ -82,7 +82,7 @@ void AchievementManager::LoadApprovedList() WARN_LOG_FMT(ACHIEVEMENTS, "Failed to load approved game settings list {}", APPROVED_LIST_FILENAME); WARN_LOG_FMT(ACHIEVEMENTS, "Error: {}", error); - return; + return {}; } auto context = Common::SHA1::CreateContext(); context->Update(temp.serialize()); @@ -94,10 +94,9 @@ void AchievementManager::LoadApprovedList() WARN_LOG_FMT(ACHIEVEMENTS, "Expected hash {}, found hash {}", Common::SHA1::DigestToString(APPROVED_LIST_HASH), Common::SHA1::DigestToString(digest)); - return; + return {}; } - std::lock_guard lg{m_lock}; - m_ini_root = std::move(temp); + return temp; } void AchievementManager::SetUpdateCallback(UpdateCallback callback) @@ -362,10 +361,18 @@ bool AchievementManager::IsHardcoreModeActive() const void AchievementManager::FilterApprovedPatches(std::vector& patches, const std::string& game_ini_id) const { + if (patches.empty()) + { + // There's nothing to verify, so let's save ourselves some work + return; + } + + std::lock_guard lg{m_lock}; + if (!IsHardcoreModeActive()) return; - if (!m_ini_root.contains(game_ini_id)) + if (!m_ini_root->contains(game_ini_id)) patches.clear(); auto patch_itr = patches.begin(); while (patch_itr != patches.end()) @@ -384,7 +391,7 @@ void AchievementManager::FilterApprovedPatches(std::vector& } auto digest = context->Finish(); - bool verified = m_ini_root.get(game_ini_id).contains(Common::SHA1::DigestToString(digest)); + bool verified = m_ini_root->get(game_ini_id).contains(Common::SHA1::DigestToString(digest)); if (!verified) { patch_itr = patches.erase(patch_itr); diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 66f4398441..6bc9e74a7a 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -29,6 +29,7 @@ #include "Common/Event.h" #include "Common/HttpRequest.h" #include "Common/JsonUtil.h" +#include "Common/Lazy.h" #include "Common/WorkQueueThread.h" #include "DiscIO/Volume.h" #include "VideoCommon/Assets/CustomTextureData.h" @@ -146,7 +147,7 @@ public: void Shutdown(); private: - AchievementManager() { LoadApprovedList(); }; + AchievementManager() = default; struct FilereaderState { @@ -154,7 +155,7 @@ private: std::unique_ptr volume; }; - void LoadApprovedList(); + static picojson::value LoadApprovedList(); static void* FilereaderOpenByFilepath(const char* path_utf8); static void* FilereaderOpenByVolume(const char* path_utf8); @@ -227,7 +228,7 @@ private: std::chrono::steady_clock::time_point m_last_rp_time = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point m_last_progress_message = std::chrono::steady_clock::now(); - picojson::value m_ini_root; + Common::Lazy m_ini_root{LoadApprovedList}; std::string m_game_ini_id; std::unordered_map m_leaderboard_map;