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 #include #include +#include #include #include #include @@ -98,14 +99,52 @@ void SConfig::LoadSettings() Config::Load(); } +const std::string SConfig::GetGameID() const +{ + std::lock_guard lock(m_metadata_lock); + return m_game_id; +} + +const std::string SConfig::GetGameTDBID() const +{ + std::lock_guard lock(m_metadata_lock); + return m_gametdb_id; +} + +const std::string SConfig::GetTitleName() const +{ + std::lock_guard lock(m_metadata_lock); + return m_title_name; +} + +const std::string SConfig::GetTitleDescription() const +{ + std::lock_guard lock(m_metadata_lock); + return m_title_description; +} + +u64 SConfig::GetTitleID() const +{ + std::lock_guard lock(m_metadata_lock); + return m_title_id; +} + +u16 SConfig::GetRevision() const +{ + std::lock_guard lock(m_metadata_lock); + return m_revision; +} + void SConfig::ResetRunningGameMetadata() { + std::lock_guard 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 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 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 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 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 +#include #include #include #include @@ -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;