mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 15:01:28 +12:00
Atomic waiting refactoring (#9208)
* Use atomic waitables instead instead of global thread wait as often as possible. * Add ::is_stopped() and and ::is_paued() which can be used in atomic loops and with atomic wait. (constexpr cpu flags test functions) * Fix notification bug of sys_spu_thread_group_exit/terminate. (old bug, enhanced by #9117) * Function time statistics at Emu.Stop() restored. (instead of current "X syscall failed with 0x00000000 : 0")
This commit is contained in:
parent
cf384795d2
commit
f43260bd58
40 changed files with 375 additions and 234 deletions
|
@ -971,6 +971,23 @@ void ppu_thread::cpu_sleep()
|
|||
lv2_obj::awake(this);
|
||||
}
|
||||
|
||||
void ppu_thread::cpu_on_stop()
|
||||
{
|
||||
if (current_function)
|
||||
{
|
||||
if (start_time)
|
||||
{
|
||||
ppu_log.warning("'%s' aborted (%fs)", current_function, (get_guest_system_time() - start_time) / 1000000.);
|
||||
}
|
||||
else
|
||||
{
|
||||
ppu_log.warning("'%s' aborted", current_function);
|
||||
}
|
||||
|
||||
current_function = {};
|
||||
}
|
||||
}
|
||||
|
||||
void ppu_thread::exec_task()
|
||||
{
|
||||
if (g_cfg.core.ppu_decoder == ppu_decoder_type::llvm)
|
||||
|
@ -1138,20 +1155,18 @@ cmd64 ppu_thread::cmd_wait()
|
|||
{
|
||||
while (true)
|
||||
{
|
||||
if (state) [[unlikely]]
|
||||
{
|
||||
if (is_stopped())
|
||||
{
|
||||
return cmd64{};
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd64 result = cmd_queue[cmd_queue.peek()].exchange(cmd64{}))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
thread_ctrl::wait();
|
||||
if (is_stopped())
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
thread_ctrl::wait_on(cmd_notify, 0);
|
||||
cmd_notify = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1205,18 +1220,7 @@ void ppu_thread::fast_call(u32 addr, u32 rtoc)
|
|||
{
|
||||
if (std::uncaught_exceptions())
|
||||
{
|
||||
if (current_function)
|
||||
{
|
||||
if (start_time)
|
||||
{
|
||||
ppu_log.warning("'%s' aborted (%fs)", current_function, (get_guest_system_time() - start_time) / 1000000.);
|
||||
}
|
||||
else
|
||||
{
|
||||
ppu_log.warning("'%s' aborted", current_function);
|
||||
}
|
||||
}
|
||||
|
||||
cpu_on_stop();
|
||||
current_function = old_func;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue