diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index d6fdfc7f25..f0b11d71ff 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -486,9 +486,13 @@ void spu_thread::cpu_stop() { if (verify(HERE, group->running--) == 1) { + { + group->stop_count++; + std::lock_guard lock(group->mutex); + group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; + } + // Notify on last thread stopped - group->stop_count++; - group->mutex.lock_unlock(); group->cond.notify_all(); } } @@ -2359,7 +2363,6 @@ bool spu_thread::stop_and_signal(u32 code) } } - group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; group->exit_status = value; group->join_state |= SPU_TGJSF_GROUP_EXIT; diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 581e17f812..85794fd601 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -329,12 +329,6 @@ error_code sys_spu_thread_group_destroy(u32 id) const auto group = idm::withdraw(id, [](lv2_spu_group& group) -> CellError { - if (group.running) - { - // Cannot destroy while threads are running - return CELL_EBUSY; - } - const auto _old = group.run_state.compare_and_swap(SPU_THREAD_GROUP_STATUS_INITIALIZED, SPU_THREAD_GROUP_STATUS_NOT_INITIALIZED); if (_old > SPU_THREAD_GROUP_STATUS_INITIALIZED) @@ -375,12 +369,6 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id) const auto group = idm::get(id, [](lv2_spu_group& group) { - if (group.running) - { - // Can't start while threads are (still) running - return false; - } - // SPU_THREAD_GROUP_STATUS_READY state is not used return group.run_state.compare_and_swap_test(SPU_THREAD_GROUP_STATUS_INITIALIZED, SPU_THREAD_GROUP_STATUS_RUNNING); }); @@ -618,7 +606,6 @@ error_code sys_spu_thread_group_terminate(u32 id, s32 value) } } - group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; group->exit_status = value; group->join_state |= SPU_TGJSF_TERMINATED; @@ -680,7 +667,6 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr cause join_state = group->join_state; exit_value = group->exit_status; group->join_state &= ~SPU_TGJSF_IS_JOINING; - group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; // hack } if (ppu.test_stopped())