diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index b883feb9e6..527a1bbdf0 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,5 +1,5 @@ #pragma once -#include "PPCThread.h" +#include "PPUThread.h" #include "Emu/Event.h" #include "Emu/SysCalls/lv2/sys_spu.h" #include "Emu/SysCalls/lv2/sys_event_flag.h" @@ -889,7 +889,8 @@ public: if (*(u64*)&Memory[reservation.addr + i * 8] != reservation.data[i]) { m_events |= SPU_EVENT_LR; - reservation.clear(); + //reservation.clear(); // ??? + break; } } } @@ -942,25 +943,20 @@ public: std::this_thread::sleep_for(std::chrono::milliseconds(1)); if (Emu.IsStopped()) { - LOG_WARNING(Log::SPU, "%s(%s) aborted (I)", __FUNCTION__, spu_ch_name[ch]); + LOG_WARNING(Log::SPU, "%s(%s) aborted", __FUNCTION__, spu_ch_name[ch]); return; } } m_intrtag[2].stat |= 1; if (CPUThread* t = Emu.GetCPU().GetThread(m_intrtag[2].thread)) { - while (t->IsAlive()) // TODO: ??? + if (t->GetType() == CPU_THREAD_PPU && !t->IsAlive()) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - if (Emu.IsStopped()) - { - LOG_WARNING(Log::SPU, "%s(%s) aborted (II)", __FUNCTION__, spu_ch_name[ch]); - return; - } + PPUThread& ppu = *(PPUThread*)t; + ppu.FastStop(); + ppu.Run(); + ppu.FastCall(ppu.PC, ppu.GPR[2], ppu.m_interrupt_arg); } - t->SetArg(0, t->m_interrupt_arg); - t->Run(); - t->Exec(); } } else diff --git a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp index 36f5839975..9588d06526 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp @@ -100,6 +100,6 @@ void sys_interrupt_thread_eoi() { sc_int.Log("sys_interrupt_thread_eoi()"); - GetCurrentPPUThread().Stop(); + GetCurrentPPUThread().FastStop(); return; }