Added locks to achievement runtime calls

Testing found that spamming toggles for Enable Leaderboards etc risked leaderboards being deleted while the runtime was in the process of recalculating them; this should clear up those conflicts.
This commit is contained in:
LillyJadeKatrin 2024-03-11 12:37:52 -04:00
parent adac827a04
commit 08ecefe0f7
1 changed files with 29 additions and 28 deletions

View File

@ -350,6 +350,7 @@ void AchievementManager::LoadUnlockData(const ResponseCallback& callback)
void AchievementManager::ActivateDeactivateAchievements() void AchievementManager::ActivateDeactivateAchievements()
{ {
std::lock_guard lg{m_lock};
if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn())
return; return;
bool enabled = Config::Get(Config::RA_ACHIEVEMENTS_ENABLED); bool enabled = Config::Get(Config::RA_ACHIEVEMENTS_ENABLED);
@ -369,6 +370,7 @@ void AchievementManager::ActivateDeactivateAchievements()
void AchievementManager::ActivateDeactivateLeaderboards() void AchievementManager::ActivateDeactivateLeaderboards()
{ {
std::lock_guard lg{m_lock};
if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn())
return; return;
bool leaderboards_enabled = bool leaderboards_enabled =
@ -395,6 +397,7 @@ void AchievementManager::ActivateDeactivateLeaderboards()
void AchievementManager::ActivateDeactivateRichPresence() void AchievementManager::ActivateDeactivateRichPresence()
{ {
std::lock_guard lg{m_lock};
if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn())
return; return;
rc_runtime_activate_richpresence( rc_runtime_activate_richpresence(
@ -659,7 +662,7 @@ void AchievementManager::FetchBadges()
void AchievementManager::DoFrame() void AchievementManager::DoFrame()
{ {
if (!m_is_game_loaded) if (!m_is_game_loaded || !Core::IsCPUThread())
return; return;
if (m_framecount == 0x200) if (m_framecount == 0x200)
{ {
@ -669,7 +672,8 @@ void AchievementManager::DoFrame()
{ {
m_framecount++; m_framecount++;
} }
Core::RunAsCPUThread([&] { {
std::lock_guard lg{m_lock};
rc_runtime_do_frame( rc_runtime_do_frame(
&m_runtime, &m_runtime,
[](const rc_runtime_event_t* runtime_event) { [](const rc_runtime_event_t* runtime_event) {
@ -679,7 +683,7 @@ void AchievementManager::DoFrame()
return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud); return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud);
}, },
this, nullptr); this, nullptr);
}); }
if (!m_system) if (!m_system)
return; return;
time_t current_time = std::time(nullptr); time_t current_time = std::time(nullptr);
@ -724,8 +728,6 @@ u32 AchievementManager::MemoryPeeker(u32 address, u32 num_bytes, void* ud)
void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runtime_event) void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runtime_event)
{ {
{
std::lock_guard lg{m_lock};
switch (runtime_event->type) switch (runtime_event->type)
{ {
case RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED: case RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED:
@ -751,7 +753,6 @@ void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runti
break; break;
} }
} }
}
std::recursive_mutex& AchievementManager::GetLock() std::recursive_mutex& AchievementManager::GetLock()
{ {