Merge pull request #11873 from AdmiralCurtiss/pause-and-lock-host

Core: Assert that only the Host thread may call PauseAndLock().
This commit is contained in:
JosJuice
2023-06-06 13:50:20 +02:00
committed by GitHub
9 changed files with 65 additions and 32 deletions

View File

@ -130,6 +130,7 @@ static Common::Event s_cpu_thread_job_finished;
static thread_local bool tls_is_cpu_thread = false;
static thread_local bool tls_is_gpu_thread = false;
static thread_local bool tls_is_host_thread = false;
static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi);
@ -224,6 +225,11 @@ bool IsGPUThread()
return tls_is_gpu_thread;
}
bool IsHostThread()
{
return tls_is_host_thread;
}
bool WantsDeterminism()
{
return s_wants_determinism;
@ -338,6 +344,16 @@ void UndeclareAsGPUThread()
tls_is_gpu_thread = false;
}
void DeclareAsHostThread()
{
tls_is_host_thread = true;
}
void UndeclareAsHostThread()
{
tls_is_host_thread = false;
}
// For the CPU Thread only.
static void CPUSetInitialExecutionState(bool force_paused = false)
{
@ -777,6 +793,8 @@ void SaveScreenShot(std::string_view name)
static bool PauseAndLock(Core::System& system, bool do_lock, bool unpause_on_unlock)
{
// WARNING: PauseAndLock is not fully threadsafe so is only valid on the Host Thread
ASSERT(IsHostThread());
if (!IsRunningAndStarted())
return true;

View File

@ -132,6 +132,8 @@ void DeclareAsCPUThread();
void UndeclareAsCPUThread();
void DeclareAsGPUThread();
void UndeclareAsGPUThread();
void DeclareAsHostThread();
void UndeclareAsHostThread();
std::string StopMessage(bool main_thread, std::string_view message);
@ -140,6 +142,7 @@ bool IsRunningAndStarted(); // is running and the CPU loop has been entere
bool IsRunningInCurrentThread(); // this tells us whether we are running in the CPU thread.
bool IsCPUThread(); // this tells us whether we are the CPU thread.
bool IsGPUThread();
bool IsHostThread();
bool WantsDeterminism();