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/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp index d9872dcc3b..041c3b150e 100644 --- a/Source/Core/Core/CoreTiming.cpp +++ b/Source/Core/Core/CoreTiming.cpp @@ -224,8 +224,7 @@ u64 GetIdleTicks() // schedule things to be executed on the main thread. void ScheduleEvent_Threadsafe(int cyclesIntoFuture, int event_type, u64 userdata) { - // TODO: Fix UI thread safety problems, and enable this assertion - // _assert_msg_(POWERPC, !Core::IsCPUThread(), "ScheduleEvent_Threadsafe from wrong thread"); + _assert_msg_(POWERPC, !Core::IsCPUThread(), "ScheduleEvent_Threadsafe from wrong thread"); std::lock_guard lk(tsWriteLock); Event ne; ne.time = globalTimer + cyclesIntoFuture; @@ -287,8 +286,8 @@ static void AddEventToQueue(Event* ne) // than Advance void ScheduleEvent(int cyclesIntoFuture, int event_type, u64 userdata) { - // TODO: Fix UI thread safety problems, and enable this assertion - //_assert_msg_(POWERPC, Core::IsCPUThread(), "ScheduleEvent from wrong thread"); + _assert_msg_(POWERPC, Core::IsCPUThread() || Core::GetState() == Core::CORE_PAUSE, + "ScheduleEvent from wrong thread"); Event *ne = GetNewEvent(); ne->userdata = userdata; ne->type = event_type; diff --git a/Source/Core/DolphinWX/FrameTools.cpp b/Source/Core/DolphinWX/FrameTools.cpp index de41814259..4edb08980f 100644 --- a/Source/Core/DolphinWX/FrameTools.cpp +++ b/Source/Core/DolphinWX/FrameTools.cpp @@ -1584,17 +1584,21 @@ void CFrame::ConnectWiimote(int wm_idx, bool connect) { if (Core::IsRunning() && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) { + bool was_unpaused = Core::PauseAndLock(true); GetUsbPointer()->AccessWiiMote(wm_idx | 0x100)->Activate(connect); wxString msg(wxString::Format(_("Wiimote %i %s"), wm_idx + 1, connect ? _("Connected") : _("Disconnected"))); Core::DisplayMessage(WxStrToStr(msg), 3000); Host_UpdateMainFrame(); + Core::PauseAndLock(false, was_unpaused); } } void CFrame::OnConnectWiimote(wxCommandEvent& event) { + bool was_unpaused = Core::PauseAndLock(true); ConnectWiimote(event.GetId() - IDM_CONNECT_WIIMOTE1, !GetUsbPointer()->AccessWiiMote((event.GetId() - IDM_CONNECT_WIIMOTE1) | 0x100)->IsConnected()); + Core::PauseAndLock(false, was_unpaused); } // Toggle fullscreen. In Windows the fullscreen mode is accomplished by expanding the m_Panel to cover @@ -1792,6 +1796,7 @@ void CFrame::UpdateGUI() GetMenuBar()->FindItem(IDM_CONNECT_BALANCEBOARD)->Enable(RunningWii); if (RunningWii) { + bool was_unpaused = Core::PauseAndLock(true); GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Check(GetUsbPointer()-> AccessWiiMote(0x0100)->IsConnected()); GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Check(GetUsbPointer()-> @@ -1802,6 +1807,7 @@ void CFrame::UpdateGUI() AccessWiiMote(0x0103)->IsConnected()); GetMenuBar()->FindItem(IDM_CONNECT_BALANCEBOARD)->Check(GetUsbPointer()-> AccessWiiMote(0x0104)->IsConnected()); + Core::PauseAndLock(false, was_unpaused); } if (m_ToolBar) 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 fffdbb3a4a..bcb9893f33 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -348,7 +348,6 @@ int main(int argc, char* argv[]) while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) updateMainFrameEvent.Wait(); - Core::Shutdown(); platform->Shutdown(); UICommon::Shutdown();