diff options
| author | LillyJadeKatrin <lilly.kitty.1988@gmail.com> | 2024-03-11 12:37:52 -0400 |
|---|---|---|
| committer | LillyJadeKatrin <lilly.kitty.1988@gmail.com> | 2024-03-14 14:32:47 -0400 |
| commit | 08ecefe0f71471610d52026fcc73af7c1966daa1 (patch) | |
| tree | 8eb5af11f6268f26e6355b5029c3469a102ce896 /Source | |
| parent | adac827a0404c9ba650726e9c52e3dc90b7a722d (diff) | |
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.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Core/AchievementManager.cpp | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 3c5b329a87..41dfac879a 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -350,6 +350,7 @@ void AchievementManager::LoadUnlockData(const ResponseCallback& callback) void AchievementManager::ActivateDeactivateAchievements() { + std::lock_guard lg{m_lock}; if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) return; bool enabled = Config::Get(Config::RA_ACHIEVEMENTS_ENABLED); @@ -369,6 +370,7 @@ void AchievementManager::ActivateDeactivateAchievements() void AchievementManager::ActivateDeactivateLeaderboards() { + std::lock_guard lg{m_lock}; if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) return; bool leaderboards_enabled = @@ -395,6 +397,7 @@ void AchievementManager::ActivateDeactivateLeaderboards() void AchievementManager::ActivateDeactivateRichPresence() { + std::lock_guard lg{m_lock}; if (!Config::Get(Config::RA_ENABLED) || !IsLoggedIn()) return; rc_runtime_activate_richpresence( @@ -659,7 +662,7 @@ void AchievementManager::FetchBadges() void AchievementManager::DoFrame() { - if (!m_is_game_loaded) + if (!m_is_game_loaded || !Core::IsCPUThread()) return; if (m_framecount == 0x200) { @@ -669,7 +672,8 @@ void AchievementManager::DoFrame() { m_framecount++; } - Core::RunAsCPUThread([&] { + { + std::lock_guard lg{m_lock}; rc_runtime_do_frame( &m_runtime, [](const rc_runtime_event_t* runtime_event) { @@ -679,7 +683,7 @@ void AchievementManager::DoFrame() return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud); }, this, nullptr); - }); + } if (!m_system) return; time_t current_time = std::time(nullptr); @@ -724,32 +728,29 @@ u32 AchievementManager::MemoryPeeker(u32 address, u32 num_bytes, void* ud) void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runtime_event) { + switch (runtime_event->type) { - std::lock_guard lg{m_lock}; - switch (runtime_event->type) - { - case RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED: - HandleAchievementTriggeredEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED: - HandleAchievementProgressUpdatedEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED: - HandleAchievementPrimedEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED: - HandleAchievementUnprimedEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_LBOARD_STARTED: - HandleLeaderboardStartedEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_LBOARD_CANCELED: - HandleLeaderboardCanceledEvent(runtime_event); - break; - case RC_RUNTIME_EVENT_LBOARD_TRIGGERED: - HandleLeaderboardTriggeredEvent(runtime_event); - break; - } + case RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED: + HandleAchievementTriggeredEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED: + HandleAchievementProgressUpdatedEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED: + HandleAchievementPrimedEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED: + HandleAchievementUnprimedEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_LBOARD_STARTED: + HandleLeaderboardStartedEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_LBOARD_CANCELED: + HandleLeaderboardCanceledEvent(runtime_event); + break; + case RC_RUNTIME_EVENT_LBOARD_TRIGGERED: + HandleLeaderboardTriggeredEvent(runtime_event); + break; } } |
