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);