mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-10 17:01:24 +12:00
Implement cpu_thread::stop_all()
This commit is contained in:
parent
8517ccfdfa
commit
2882220cbd
3 changed files with 36 additions and 17 deletions
|
@ -8,6 +8,8 @@
|
|||
#include "Emu/Cell/PPUThread.h"
|
||||
#include "Emu/Cell/SPUThread.h"
|
||||
|
||||
#include <thread>
|
||||
|
||||
DECLARE(cpu_thread::g_threads_created){0};
|
||||
DECLARE(cpu_thread::g_threads_deleted){0};
|
||||
|
||||
|
@ -132,7 +134,7 @@ void cpu_thread::operator()()
|
|||
g_cpu_suspend_lock.lock_unlock();
|
||||
|
||||
// Check thread status
|
||||
while (!(state & (cpu_flag::exit + cpu_flag::dbg_global_stop)))
|
||||
while (!(state & (cpu_flag::exit + cpu_flag::dbg_global_stop)) && !Emu.IsStopped())
|
||||
{
|
||||
// Check stop status
|
||||
if (!(state & cpu_flag::stop))
|
||||
|
@ -389,3 +391,32 @@ cpu_thread::suspend_all::~suspend_all()
|
|||
m_this->check_state();
|
||||
}
|
||||
}
|
||||
|
||||
void cpu_thread::stop_all() noexcept
|
||||
{
|
||||
if (g_tls_current_cpu_thread)
|
||||
{
|
||||
// Report unsupported but unnecessary case
|
||||
LOG_FATAL(GENERAL, "cpu_thread::stop_all() has been called from a CPU thread.");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
::vip_lock lock(g_cpu_suspend_lock);
|
||||
|
||||
for_all_cpu([](cpu_thread* cpu)
|
||||
{
|
||||
cpu->state += cpu_flag::dbg_global_stop;
|
||||
cpu->notify();
|
||||
});
|
||||
}
|
||||
|
||||
LOG_NOTICE(GENERAL, "All CPU threads have been signaled.");
|
||||
|
||||
while (g_cpu_array_sema)
|
||||
{
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
LOG_NOTICE(GENERAL, "All CPU threads have been stopped.");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue