diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2024-07-09 15:27:37 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-09 15:27:37 +0200 |
| commit | bb03fc04ccbdd5a86dfbe7ab6179d240f5b0e076 (patch) | |
| tree | 545e2bb5a958106fce952776f1fb0b27075b97ca /Source/Core | |
| parent | 01a2cf8db9416b90eef3160a800f7b2560a3ae4a (diff) | |
| parent | e6b9091ffce7f87e241aef8818e7cd0ee4053782 (diff) | |
Merge pull request #12922 from JosJuice/android-approved-list-crash
RetroAchievements: Delay calling LoadApprovedList
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/AchievementManager.cpp | 21 | ||||
| -rw-r--r-- | Source/Core/Core/AchievementManager.h | 7 |
2 files changed, 18 insertions, 10 deletions
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<PatchEngine::Patch>& 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<PatchEngine::Patch>& } 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<DiscIO::Volume> 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<picojson::value> m_ini_root{LoadApprovedList}; std::string m_game_ini_id; std::unordered_map<AchievementId, LeaderboardStatus> m_leaderboard_map; |
