mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 06:21:26 +12:00
Improve Stop Watchdog
Prevent termination if PPU LLVM compilation is in progress.
This commit is contained in:
parent
2d2ed7efd0
commit
938ca90a02
2 changed files with 16 additions and 1 deletions
|
@ -66,6 +66,8 @@ const bool s_use_ssse3 = utils::has_ssse3();
|
||||||
|
|
||||||
extern u64 get_guest_system_time();
|
extern u64 get_guest_system_time();
|
||||||
|
|
||||||
|
extern atomic_t<u64> g_watchdog_hold_ctr;
|
||||||
|
|
||||||
extern atomic_t<const char*> g_progr;
|
extern atomic_t<const char*> g_progr;
|
||||||
extern atomic_t<u32> g_progr_ptotal;
|
extern atomic_t<u32> g_progr_ptotal;
|
||||||
extern atomic_t<u32> g_progr_pdone;
|
extern atomic_t<u32> g_progr_pdone;
|
||||||
|
@ -1678,6 +1680,9 @@ extern void ppu_initialize(const ppu_module& info)
|
||||||
atomic_t<u64> index = 0;
|
atomic_t<u64> index = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Prevent watchdog thread from terminating
|
||||||
|
g_watchdog_hold_ctr++;
|
||||||
|
|
||||||
named_thread_group threads(fmt::format("PPUW.%u.", ++g_fxo->get<thread_index_allocator>()->index), thread_count, [&]()
|
named_thread_group threads(fmt::format("PPUW.%u.", ++g_fxo->get<thread_index_allocator>()->index), thread_count, [&]()
|
||||||
{
|
{
|
||||||
// Set low priority
|
// Set low priority
|
||||||
|
@ -1708,6 +1713,8 @@ extern void ppu_initialize(const ppu_module& info)
|
||||||
|
|
||||||
threads.join();
|
threads.join();
|
||||||
|
|
||||||
|
g_watchdog_hold_ctr--;
|
||||||
|
|
||||||
if (Emu.IsStopped() || !get_current_cpu_thread())
|
if (Emu.IsStopped() || !get_current_cpu_thread())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -59,6 +59,8 @@ bool g_use_rtm;
|
||||||
|
|
||||||
std::string g_cfg_defaults;
|
std::string g_cfg_defaults;
|
||||||
|
|
||||||
|
atomic_t<u64> g_watchdog_hold_ctr{0};
|
||||||
|
|
||||||
extern void ppu_load_exec(const ppu_exec_object&);
|
extern void ppu_load_exec(const ppu_exec_object&);
|
||||||
extern void spu_load_exec(const spu_exec_object&);
|
extern void spu_load_exec(const spu_exec_object&);
|
||||||
extern void ppu_initialize(const ppu_module&);
|
extern void ppu_initialize(const ppu_module&);
|
||||||
|
@ -1710,7 +1712,7 @@ void Emulator::Stop(bool restart)
|
||||||
|
|
||||||
named_thread stop_watchdog("Stop Watchdog", [&]()
|
named_thread stop_watchdog("Stop Watchdog", [&]()
|
||||||
{
|
{
|
||||||
for (uint i = 0; thread_ctrl::state() != thread_state::aborting; i++)
|
for (uint i = 0; thread_ctrl::state() != thread_state::aborting;)
|
||||||
{
|
{
|
||||||
// We don't need accurate timekeeping, using clocks may interfere with debugging
|
// We don't need accurate timekeeping, using clocks may interfere with debugging
|
||||||
if (i >= 1000)
|
if (i >= 1000)
|
||||||
|
@ -1721,6 +1723,12 @@ void Emulator::Stop(bool restart)
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_ctrl::wait_for(5'000);
|
thread_ctrl::wait_for(5'000);
|
||||||
|
|
||||||
|
if (!g_watchdog_hold_ctr)
|
||||||
|
{
|
||||||
|
// Don't count if there are still uninterruptable threads like PPU LLVM workers
|
||||||
|
i++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue