From b3c9f49cbedd03673a490cbeb7f886a3663e3bb8 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Fri, 2 Jun 2023 18:00:51 +0200 Subject: Core: Assert that only the Host thread may call PauseAndLock(). --- Source/Core/Core/Core.cpp | 18 ++++++++++++++++++ Source/Core/Core/Core.h | 3 +++ Source/Core/DolphinNoGUI/MainNoGUI.cpp | 2 ++ Source/Core/DolphinQt/Host.cpp | 10 ---------- Source/Core/DolphinQt/Main.cpp | 2 +- Source/Core/DolphinQt/Settings.cpp | 2 +- Source/Core/DolphinTool/ToolMain.cpp | 3 +++ 7 files changed, 28 insertions(+), 12 deletions(-) (limited to 'Source/Core') diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 1e940d1fed..74a87ed779 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -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 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; diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index e237e25711..0ff8c32b5c 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -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(); diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index 9ba5de1e98..1371507e1f 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -181,6 +181,8 @@ static std::unique_ptr GetPlatform(const optparse::Values& options) int main(int argc, char* argv[]) { + Core::DeclareAsHostThread(); + auto parser = CommandLineParse::CreateParser(CommandLineParse::ParserOptions::OmitGUIOptions); parser->add_option("-p", "--platform") .action("store") diff --git a/Source/Core/DolphinQt/Host.cpp b/Source/Core/DolphinQt/Host.cpp index 036dc2cffa..6a4939b106 100644 --- a/Source/Core/DolphinQt/Host.cpp +++ b/Source/Core/DolphinQt/Host.cpp @@ -59,16 +59,6 @@ Host* Host::GetInstance() return s_instance; } -void Host::DeclareAsHostThread() -{ - tls_is_host_thread = true; -} - -bool Host::IsHostThread() -{ - return tls_is_host_thread; -} - void Host::SetRenderHandle(void* handle) { m_render_to_main = Config::Get(Config::MAIN_RENDER_TO_MAIN); diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 8fa1afff19..1c658e8d62 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -123,7 +123,7 @@ int main(int argc, char* argv[]) } #endif - Host::GetInstance()->DeclareAsHostThread(); + Core::DeclareAsHostThread(); #ifdef __APPLE__ // On macOS, a command line option matching the format "-psn_X_XXXXXX" is passed when diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index d915f4e916..c6a06336e2 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -71,7 +71,7 @@ Settings::Settings() }); m_hotplug_callback_handle = g_controller_interface.RegisterDevicesChangedCallback([this] { - if (Host::GetInstance()->IsHostThread()) + if (Core::IsHostThread()) { emit DevicesChanged(); } diff --git a/Source/Core/DolphinTool/ToolMain.cpp b/Source/Core/DolphinTool/ToolMain.cpp index 59613a17f6..263104a976 100644 --- a/Source/Core/DolphinTool/ToolMain.cpp +++ b/Source/Core/DolphinTool/ToolMain.cpp @@ -8,6 +8,7 @@ #include #include "Common/Version.h" +#include "Core/Core.h" #include "DolphinTool/Command.h" #include "DolphinTool/ConvertCommand.h" #include "DolphinTool/HeaderCommand.h" @@ -27,6 +28,8 @@ static int PrintUsage(int code) int main(int argc, char* argv[]) { + Core::DeclareAsHostThread(); + if (argc < 2) return PrintUsage(1); -- cgit v1.2.3