Fix Emulator::Pause race with IDM

This commit is contained in:
Eladash 2021-03-02 17:00:16 +02:00 committed by Ivan
parent aad5283786
commit d51bb8b1cc

View File

@ -597,6 +597,23 @@ cpu_thread::~cpu_thread()
cpu_thread::cpu_thread(u32 id)
: id(id)
{
while (Emu.GetStatus() == system_state::paused)
{
// Solve race between Emulator::Pause and this construction of thread which most likely is guarded by IDM mutex
state += cpu_flag::dbg_global_pause;
if (Emu.GetStatus() != system_state::paused)
{
// Emulator::Resume was called inbetween
state -= cpu_flag::dbg_global_pause;
// Recheck if state is inconsistent
continue;
}
break;
}
g_threads_created++;
}