From 3faaf9e7fb92560b9c0b38f0eeeba4514cf5c0c2 Mon Sep 17 00:00:00 2001 From: eladash Date: Wed, 17 Oct 2018 08:16:30 +0300 Subject: [PATCH] lv2: Fix lwmutex locking --- rpcs3/Emu/Cell/lv2/sys_lwcond.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp index 635ac0c479..170496c1d2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp @@ -266,7 +266,7 @@ error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id return cpu; } - mutex->signaled++; + mutex->signaled = 1; return nullptr; }); diff --git a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp index 733a9acf23..7ebaffc224 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp @@ -75,22 +75,16 @@ error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout) const auto mutex = idm::get(lwmutex_id, [&](lv2_lwmutex& mutex) { - if (u32 value = mutex.signaled) + if (mutex.signaled.try_dec()) { - if (mutex.signaled.compare_and_swap_test(value, value - 1)) - { - return true; - } + return true; } std::lock_guard lock(mutex.mutex); - if (u32 value = mutex.signaled) + if (mutex.signaled.try_dec()) { - if (mutex.signaled.compare_and_swap_test(value, value - 1)) - { - return true; - } + return true; } mutex.sq.emplace_back(&ppu); @@ -152,15 +146,7 @@ error_code _sys_lwmutex_trylock(u32 lwmutex_id) const auto mutex = idm::check(lwmutex_id, [&](lv2_lwmutex& mutex) { - if (u32 value = mutex.signaled) - { - if (mutex.signaled.compare_and_swap_test(value, value - 1)) - { - return true; - } - } - - return false; + return mutex.signaled.try_dec(); }); if (!mutex) @@ -189,7 +175,7 @@ error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id) return cpu; } - mutex.signaled++; + mutex.signaled = 1; return nullptr; });