mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-05-09 21:54:54 +00:00
Core/ConfigManager: Add locks for metadata methods
All metadata access methods now acquire a lock on `m_metadata_lock` to prevent race conditions.
This commit is contained in:
parent
803241c64b
commit
892d6e30df
2 changed files with 51 additions and 6 deletions
|
@ -6,6 +6,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -98,14 +99,52 @@ void SConfig::LoadSettings()
|
||||||
Config::Load();
|
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()
|
void SConfig::ResetRunningGameMetadata()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||||
SetRunningGameMetadata("00000000", "", 0, 0, DiscIO::Region::Unknown);
|
SetRunningGameMetadata("00000000", "", 0, 0, DiscIO::Region::Unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume,
|
void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume,
|
||||||
const DiscIO::Partition& partition)
|
const DiscIO::Partition& partition)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(m_metadata_lock);
|
||||||
if (partition == volume.GetGamePartition())
|
if (partition == volume.GetGamePartition())
|
||||||
{
|
{
|
||||||
SetRunningGameMetadata(volume.GetGameID(), volume.GetGameTDBID(),
|
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)
|
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();
|
const u64 tmd_title_id = tmd.GetTitleId();
|
||||||
|
|
||||||
// If we're launching a disc game, we want to read the revision from
|
// 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)
|
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);
|
SetRunningGameMetadata(game_id, "", 0, 0, DiscIO::Region::Unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
|
void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
|
||||||
u64 title_id, u16 revision, DiscIO::Region region)
|
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 ||
|
const bool was_changed = m_game_id != game_id || m_gametdb_id != gametdb_id ||
|
||||||
m_title_id != title_id || m_revision != revision;
|
m_title_id != title_id || m_revision != revision;
|
||||||
m_game_id = game_id;
|
m_game_id = game_id;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <mutex>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -58,15 +59,16 @@ struct SConfig
|
||||||
std::string m_strSRAM;
|
std::string m_strSRAM;
|
||||||
|
|
||||||
std::string m_debugger_game_id;
|
std::string m_debugger_game_id;
|
||||||
|
|
||||||
// TODO: remove this as soon as the ticket view hack in IOS/ES/Views is dropped.
|
// TODO: remove this as soon as the ticket view hack in IOS/ES/Views is dropped.
|
||||||
bool m_disc_booted_from_game_list = false;
|
bool m_disc_booted_from_game_list = false;
|
||||||
|
|
||||||
const std::string& GetGameID() const { return m_game_id; }
|
const std::string GetGameID() const;
|
||||||
const std::string& GetGameTDBID() const { return m_gametdb_id; }
|
const std::string GetGameTDBID() const;
|
||||||
const std::string& GetTitleName() const { return m_title_name; }
|
const std::string GetTitleName() const;
|
||||||
const std::string& GetTitleDescription() const { return m_title_description; }
|
const std::string GetTitleDescription() const;
|
||||||
u64 GetTitleID() const { return m_title_id; }
|
u64 GetTitleID() const;
|
||||||
u16 GetRevision() const { return m_revision; }
|
u16 GetRevision() const;
|
||||||
void ResetRunningGameMetadata();
|
void ResetRunningGameMetadata();
|
||||||
void SetRunningGameMetadata(const DiscIO::Volume& volume, const DiscIO::Partition& partition);
|
void SetRunningGameMetadata(const DiscIO::Volume& volume, const DiscIO::Partition& partition);
|
||||||
void SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Platform platform);
|
void SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Platform platform);
|
||||||
|
@ -114,6 +116,7 @@ private:
|
||||||
u64 title_id, u16 revision, DiscIO::Region region);
|
u64 title_id, u16 revision, DiscIO::Region region);
|
||||||
|
|
||||||
static SConfig* m_Instance;
|
static SConfig* m_Instance;
|
||||||
|
mutable std::recursive_mutex m_metadata_lock;
|
||||||
|
|
||||||
std::string m_game_id;
|
std::string m_game_id;
|
||||||
std::string m_gametdb_id;
|
std::string m_gametdb_id;
|
||||||
|
|
Loading…
Add table
Reference in a new issue