From f143035af1d53bbffe78c00d1148aef7676d5a78 Mon Sep 17 00:00:00 2001 From: Nekotekina <nekotekina@gmail.com> Date: Sun, 10 Feb 2019 18:22:48 +0300 Subject: [PATCH] Fix sys_spu_thread_group_join wait condition After waiting, thread group cannot be safely accessed Following #5643 --- rpcs3/Emu/Cell/SPUThread.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_spu.cpp | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 96973c6c17..d366907109 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -531,6 +531,7 @@ void spu_thread::cpu_stop() // Send exit status directly to the joining thread ppu->gpr[4] = group->join_state; ppu->gpr[5] = group->exit_status; + group->join_state.release(0); } } diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index a31d9f5b7c..0be676ad92 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -659,12 +659,13 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause else { // Subscribe to receive status in r4-r5 + ppu.gpr[4] = 0; group->waiter = &ppu; } lv2_obj::sleep(ppu); - while (!group->join_state || group->run_state != SPU_THREAD_GROUP_STATUS_INITIALIZED) + while (!ppu.gpr[4]) { if (ppu.is_stopped()) { @@ -673,8 +674,6 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause group->cond.wait(lock); } - - group->join_state.release(0); } while (0);