1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 02:32:36 +01:00

CPU preemption control: don't yield if we can't stop

This commit is contained in:
Eladash 2022-09-15 08:02:20 +03:00 committed by Ivan
parent c8199de188
commit 9d9e18f614

View File

@ -736,7 +736,7 @@ bool cpu_thread::check_state() noexcept
if (!is_stopped(flags) && flags.none_of(cpu_flag::ret)) if (!is_stopped(flags) && flags.none_of(cpu_flag::ret))
{ {
// Check pause flags which hold thread inside check_state (ignore suspend/debug flags on cpu_flag::temp) // Check pause flags which hold thread inside check_state (ignore suspend/debug flags on cpu_flag::temp)
if (flags & (cpu_flag::pause + cpu_flag::memory + cpu_flag::yield + cpu_flag::preempt) || (cpu_can_stop && flags & (cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::suspend))) if (flags & (cpu_flag::pause + cpu_flag::memory) || (cpu_can_stop && flags & (cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::suspend + cpu_flag::yield + cpu_flag::preempt)))
{ {
if (!(flags & cpu_flag::wait)) if (!(flags & cpu_flag::wait))
{ {
@ -744,7 +744,7 @@ bool cpu_thread::check_state() noexcept
store = true; store = true;
} }
if (flags & (cpu_flag::yield + cpu_flag::preempt)) if (flags & (cpu_flag::yield + cpu_flag::preempt) && cpu_can_stop)
{ {
flags -= (cpu_flag::yield + cpu_flag::preempt); flags -= (cpu_flag::yield + cpu_flag::preempt);
store = true; store = true;
@ -779,7 +779,7 @@ bool cpu_thread::check_state() noexcept
return store; return store;
}).first; }).first;
if (state0 & cpu_flag::preempt) if (state0 & cpu_flag::preempt && cpu_can_stop)
{ {
if (cpu_flag::wait - state0) if (cpu_flag::wait - state0)
{ {
@ -899,7 +899,7 @@ bool cpu_thread::check_state() noexcept
continue; continue;
} }
if (state0 & cpu_flag::yield && cpu_flag::wait - state0) if (state0 & cpu_flag::yield && cpu_flag::wait - state0 && cpu_can_stop)
{ {
if (auto spu = try_get<spu_thread>()) if (auto spu = try_get<spu_thread>())
{ {