1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-21 18:22:33 +01:00

Thread.h: Improve thread abort performance

This commit is contained in:
Eladash 2022-08-25 12:12:29 +03:00 committed by kd-11
parent c7586de280
commit daf43989fc
2 changed files with 22 additions and 3 deletions

View File

@ -635,9 +635,11 @@ public:
// Join thread by thread_state::finished
named_thread& operator=(thread_state s)
{
bool notify_sync = false;
if (s >= thread_state::aborting && thread::m_sync.fetch_op([](u64& v){ return !(v & 3) && (v |= 1); }).second)
{
thread::m_sync.notify_one(1);
notify_sync = true;
}
if constexpr (std::is_assignable_v<Context&, thread_state>)
@ -645,6 +647,12 @@ public:
static_cast<Context&>(*this) = s;
}
if (notify_sync)
{
// Notify after context abortion has been made so all conditions for wake-up be satisfied by the time of notification
thread::m_sync.notify_one(1);
}
if (s == thread_state::finished)
{
// This participates in emulation stopping, use destruction-alike semantics

View File

@ -881,8 +881,19 @@ void cpu_thread::notify()
cpu_thread& cpu_thread::operator=(thread_state)
{
state += cpu_flag::exit;
state.notify_one(cpu_flag::exit);
if (state & cpu_flag::exit)
{
// Must be notified elsewhere or self-raised
return *this;
}
const auto old = state.fetch_add(cpu_flag::exit);
if (old & cpu_flag::wait && old.none_of(cpu_flag::again + cpu_flag::exit))
{
state.notify_one(cpu_flag::exit);
}
return *this;
}