diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 0e0a063194..7098776a53 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -1312,7 +1312,10 @@ bool cpu_thread::suspend_work::push(cpu_thread* _this) noexcept void cpu_thread::cleanup() noexcept { - ensure(!s_cpu_counter); + if (u64 count = s_cpu_counter) + { + fmt::throw_exception("cpu_thread::cleanup(): %u threads are still active! (created=%u, destroyed=%u)", count, +g_threads_created, +g_threads_deleted); + } sys_log.notice("All CPU threads have been stopped. [+: %u]", +g_threads_created); diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index af86f12b8a..06973dc2ca 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1767,11 +1767,8 @@ void spu_thread::cleanup() // Free range lock (and signals cleanup was called to the destructor) vm::free_range_lock(range_lock); - // Signal the debugger about the termination - if (!state.test_and_set(cpu_flag::exit)) - { - state.notify_one(); - } + // Terminate and join thread + static_cast&>(*this) = thread_state::finished; } spu_thread::~spu_thread()