From 7fa42cfaadfc330a50efad910750470bf5d5d524 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 26 Jul 2017 22:35:45 +0300 Subject: [PATCH] Fix sys_semaphore_wait (on timeout) --- rpcs3/Emu/Cell/lv2/sys_semaphore.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp index 8b74595691..a4c1f08d3d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp @@ -131,7 +131,13 @@ error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout) { semaphore_lock lock(sem->mutex); - const s32 val = sem->val.fetch_op([](s32& val) + if (!sem->unqueue(sem->sq, &ppu)) + { + timeout = 0; + continue; + } + + verify(HERE), 0 > sem->val.fetch_op([](s32& val) { if (val < 0) { @@ -139,13 +145,6 @@ error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout) } }); - if (val >= 0) - { - timeout = 0; - continue; - } - - verify(HERE), sem->unqueue(sem->sq, &ppu); ppu.gpr[3] = CELL_ETIMEDOUT; break; }