diff options
| author | Aneesh Maganti <28660350+aminoa@users.noreply.github.com> | 2025-02-10 15:28:09 -0500 |
|---|---|---|
| committer | Admiral H. Curtiss <pikachu025@gmail.com> | 2025-02-16 23:15:11 +0100 |
| commit | 892d6e30dfb7ef8b444819f2ca271b8357f77aa9 (patch) | |
| tree | 4fc038d0dbaafd5eb3bb3e510edcbfec4d924b82 | |
| parent | 803241c64bf7d227bf203d1ea89f46a8f864c08b (diff) | |
Core/ConfigManager: Add locks for metadata methods
All metadata access methods now acquire a lock on `m_metadata_lock` to prevent race conditions.
| -rw-r--r-- | Source/Core/Core/ConfigManager.cpp | 42 | ||||
| -rw-r--r-- | Source/Core/Core/ConfigManager.h | 15 |
2 files changed, 51 insertions, 6 deletions
diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index 21d722290e..5a123c87cd 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -6,6 +6,7 @@ #include <algorithm> #include <climits> #include <memory> +#include <mutex> #include <optional> #include <sstream> #include <string> @@ -98,14 +99,52 @@ void SConfig::LoadSettings() Config::Load(); } +const std::string SConfig::GetGameID() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_game_id; +} + +const std::string SConfig::GetGameTDBID() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_gametdb_id; +} + +const std::string SConfig::GetTitleName() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_title_name; +} + +const std::string SConfig::GetTitleDescription() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_title_description; +} + +u64 SConfig::GetTitleID() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_title_id; +} + +u16 SConfig::GetRevision() const +{ + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); + return m_revision; +} + void SConfig::ResetRunningGameMetadata() { + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); SetRunningGameMetadata("00000000", "", 0, 0, DiscIO::Region::Unknown); } void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume, const DiscIO::Partition& partition) { + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); if (partition == volume.GetGamePartition()) { SetRunningGameMetadata(volume.GetGameID(), volume.GetGameTDBID(), @@ -122,6 +161,7 @@ void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume, void SConfig::SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Platform platform) { + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); const u64 tmd_title_id = tmd.GetTitleId(); // If we're launching a disc game, we want to read the revision from @@ -139,12 +179,14 @@ void SConfig::SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Plat void SConfig::SetRunningGameMetadata(const std::string& game_id) { + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); SetRunningGameMetadata(game_id, "", 0, 0, DiscIO::Region::Unknown); } void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id, u64 title_id, u16 revision, DiscIO::Region region) { + std::lock_guard<std::recursive_mutex> lock(m_metadata_lock); const bool was_changed = m_game_id != game_id || m_gametdb_id != gametdb_id || m_title_id != title_id || m_revision != revision; m_game_id = game_id; diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index 999cc9f86c..d21b087a51 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -4,6 +4,7 @@ #pragma once #include <limits> +#include <mutex> #include <optional> #include <set> #include <string> @@ -58,15 +59,16 @@ struct SConfig std::string m_strSRAM; std::string m_debugger_game_id; + // TODO: remove this as soon as the ticket view hack in IOS/ES/Views is dropped. bool m_disc_booted_from_game_list = false; - const std::string& GetGameID() const { return m_game_id; } - const std::string& GetGameTDBID() const { return m_gametdb_id; } - const std::string& GetTitleName() const { return m_title_name; } - const std::string& GetTitleDescription() const { return m_title_description; } - u64 GetTitleID() const { return m_title_id; } - u16 GetRevision() const { return m_revision; } + const std::string GetGameID() const; + const std::string GetGameTDBID() const; + const std::string GetTitleName() const; + const std::string GetTitleDescription() const; + u64 GetTitleID() const; + u16 GetRevision() const; void ResetRunningGameMetadata(); void SetRunningGameMetadata(const DiscIO::Volume& volume, const DiscIO::Partition& partition); void SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Platform platform); @@ -114,6 +116,7 @@ private: u64 title_id, u16 revision, DiscIO::Region region); static SConfig* m_Instance; + mutable std::recursive_mutex m_metadata_lock; std::string m_game_id; std::string m_gametdb_id; |
