From ba664b3293e88ddee94a4b922ced192f3270b569 Mon Sep 17 00:00:00 2001 From: comex Date: Mon, 13 Apr 2015 02:09:39 -0400 Subject: [PATCH] Join the emu thread in Core::Stop. Get rid of Core::Shutdown which did that before. Core::Shutdown was only called on app exit, yet the emu thread exits whenever emulation stops; if you launched a new game it would just join via the destructor when s_emu_thread was set to a new thread. (Incidentally, the destructor also makes explicitly joining on app exit rather pointless.) Because the GUI thread wasn't waiting for the CPU thread to fully shut down, Core::IsRunning would remain true briefly after CFrame::DoStop which, given Dolphin's penchant for accessing variables belonging to other threads, can only mean trouble... In my case, because the previous commit caused UpdateGUI, which is called at the end of DoStop, to call PauseAndLock, which checks IsRunning, pressing stop at the right time would cause strange behavior. --- Source/Core/Core/Core.cpp | 8 ++------ Source/Core/Core/Core.h | 1 - Source/Core/DolphinWX/Main.cpp | 1 - Source/Core/DolphinWX/MainNoGUI.cpp | 1 - 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 113ac0e553..c3bbaa4515 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -267,6 +267,8 @@ void Stop() // - Hammertime! g_video_backend->Video_ExitLoop(); } + if (s_emu_thread.joinable()) + s_emu_thread.join(); } static void DeclareAsCPUThread() @@ -793,12 +795,6 @@ void UpdateTitle() Host_UpdateTitle(SMessage); } -void Shutdown() -{ - if (s_emu_thread.joinable()) - s_emu_thread.join(); -} - void SetOnStoppedCallback(StoppedCallbackFunc callback) { s_on_stopped_callback = callback; diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index 341036bead..63eabe247b 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -40,7 +40,6 @@ enum EState bool Init(); void Stop(); -void Shutdown(); std::string StopMessage(bool, std::string); diff --git a/Source/Core/DolphinWX/Main.cpp b/Source/Core/DolphinWX/Main.cpp index 8734eebedf..300d03720b 100644 --- a/Source/Core/DolphinWX/Main.cpp +++ b/Source/Core/DolphinWX/Main.cpp @@ -371,7 +371,6 @@ void DolphinApp::OnEndSession(wxCloseEvent& event) int DolphinApp::OnExit() { - Core::Shutdown(); UICommon::Shutdown(); delete m_locale; diff --git a/Source/Core/DolphinWX/MainNoGUI.cpp b/Source/Core/DolphinWX/MainNoGUI.cpp index 7e072288fd..0cd7193d22 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -343,7 +343,6 @@ int main(int argc, char* argv[]) while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) updateMainFrameEvent.Wait(); - Core::Shutdown(); platform->Shutdown(); UICommon::Shutdown();