Synchronize DVDInterface::ChangeDisc with the CPU thread properly.

This addresses a bit of thread unsafety mentioned in a comment, and
fixes a 'ScheduleEvent_Threadsafe from main thread' message.

To make this work nicely, make PauseAndLock call DeclareAsCPUThread -
i.e. while you have the CPU thread locked, you can consider yourself the
CPU thread.
This commit is contained in:
comex
2015-06-06 01:41:26 -04:00
committed by JosJuice
parent 3de1ec384a
commit e602eac4f9
4 changed files with 27 additions and 6 deletions

View File

@ -149,13 +149,22 @@ void Break()
bool PauseAndLock(bool do_lock, bool unpause_on_unlock)
{
static bool s_have_fake_cpu_thread;
bool wasUnpaused = !IsStepping();
if (do_lock)
{
// we can't use EnableStepping, that would causes deadlocks with both audio and video
PowerPC::Pause();
if (!Core::IsCPUThread())
{
m_csCpuOccupied.lock();
s_have_fake_cpu_thread = true;
Core::DeclareAsCPUThread();
}
else
{
s_have_fake_cpu_thread = false;
}
}
else
{
@ -165,8 +174,12 @@ bool PauseAndLock(bool do_lock, bool unpause_on_unlock)
m_StepEvent.Set();
}
if (!Core::IsCPUThread())
if (s_have_fake_cpu_thread)
{
Core::UndeclareAsCPUThread();
m_csCpuOccupied.unlock();
s_have_fake_cpu_thread = false;
}
}
return wasUnpaused;
}