SPU: cpu_work() fixup, fix recursion in AV handler

This commit is contained in:
Eladash 2021-09-17 20:18:12 +03:00 committed by Ivan
parent 5870da0b55
commit e10c6cbaf7
3 changed files with 19 additions and 15 deletions

View file

@ -1657,14 +1657,20 @@ void spu_thread::cpu_task()
void spu_thread::cpu_work()
{
if (std::exchange(in_cpu_work, true))
{
return;
}
const auto timeout = +g_cfg.core.mfc_transfers_timeout;
// If either MFC size exceeds limit or timeout has been reached execute pending MFC commands
if (mfc_size > g_cfg.core.mfc_transfers_shuffling || (timeout && get_system_time() - mfc_last_timestamp >= timeout))
{
do_mfc(false, false);
check_mfc_interrupts(pc + 4);
}
in_cpu_work = false;
}
struct raw_spu_cleanup
@ -3187,6 +3193,11 @@ bool spu_thread::process_mfc_cmd()
// Process MFC commands
do_mfc();
if (mfc_size < 16)
{
break;
}
auto old = state.add_fetch(cpu_flag::wait);
if (is_stopped(old))