diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 820fd99b5f..47fc3b3edb 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1899,7 +1899,17 @@ void thread_base::initialize(void (*error_cb)(), bool(*wait_cb)(const void*)) void thread_base::notify_abort() noexcept { m_signal.try_inc(); - atomic_storage_futex::raw_notify(+m_state_notifier); + + while (auto ptr = m_state_notifier.load()) + { + // Since this function is not perfectly implemented, run it in a loop + atomic_storage_futex::raw_notify(ptr); + + if (m_state_notifier.load() == ptr) + { + break; + } + } } bool thread_base::finalize(thread_state result_state) noexcept diff --git a/Utilities/Thread.h b/Utilities/Thread.h index 0a38703da3..20aa45fcc8 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -311,6 +311,7 @@ class named_thread final : public Context, result_storage_t, thread_bas if (_this->m_state >= thread_state::aborting) { + _this->m_state_notifier.store(data); return false; } diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 728d67d584..c87ee013aa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -1915,7 +1915,7 @@ error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr id, vm::ptr +template error_code raw_spu_destroy(ppu_thread& ppu, u32 id) { const u32 idm_id = spu_thread::find_raw_spu(id);