From 01987be6b9aace100889991499f0f60eadf3537b Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 31 Jul 2013 09:09:18 -0500 Subject: [PATCH 1/3] Make sure that WiimoteReal is really shutdown on app exit. Particulary ensure that the wiimote scanning thread is joined. This fixes a crash on shutdown if scanning has been initiated. --- Source/Core/Core/Src/HW/Wiimote.cpp | 2 +- Source/Core/Core/Src/HW/Wiimote.h | 1 + Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp | 11 ++++------- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Source/Core/Core/Src/HW/Wiimote.cpp b/Source/Core/Core/Src/HW/Wiimote.cpp index 0bf10b343d..2061e80f2e 100644 --- a/Source/Core/Core/Src/HW/Wiimote.cpp +++ b/Source/Core/Core/Src/HW/Wiimote.cpp @@ -32,7 +32,7 @@ void Shutdown() delete *i; g_plugin.controllers.clear(); - WiimoteReal::Shutdown(); + WiimoteReal::Stop(); g_controller_interface.Shutdown(); } diff --git a/Source/Core/Core/Src/HW/Wiimote.h b/Source/Core/Core/Src/HW/Wiimote.h index 04c09c5ab5..be1de18bc9 100644 --- a/Source/Core/Core/Src/HW/Wiimote.h +++ b/Source/Core/Core/Src/HW/Wiimote.h @@ -54,6 +54,7 @@ namespace WiimoteReal { void Initialize(bool wait = false); +void Stop(); void Shutdown(); void Resume(); void Pause(); diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp index b5297d8655..82509604c8 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp @@ -570,15 +570,15 @@ void Initialize(bool wait) g_real_wiimotes_initialized = true; } -void Shutdown(void) +void Stop(void) { for (unsigned int i = 0; i < MAX_BBMOTES; ++i) if (g_wiimotes[i] && g_wiimotes[i]->IsConnected()) g_wiimotes[i]->EmuStop(); +} - // WiimoteReal is shutdown on app exit - return; - +void Shutdown(void) +{ g_wiimote_scanner.StopScanning(); std::lock_guard lk(g_refresh_lock); @@ -589,9 +589,6 @@ void Shutdown(void) NOTICE_LOG(WIIMOTE, "WiimoteReal::Shutdown"); g_real_wiimotes_initialized = false; - - for (unsigned int i = 0; i < MAX_BBMOTES; ++i) - HandleWiimoteDisconnect(i); } void Resume() From 7aae59a7665d04dc6f18f500fead62c33012500a Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Wed, 31 Jul 2013 09:19:28 -0500 Subject: [PATCH 2/3] Add comments to explain the usage of the WiimoteReal Stop/Shutdown routine usage. --- Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp index 82509604c8..d30e1b37c9 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp @@ -570,6 +570,7 @@ void Initialize(bool wait) g_real_wiimotes_initialized = true; } +// called on emulation shutdown void Stop(void) { for (unsigned int i = 0; i < MAX_BBMOTES; ++i) @@ -577,6 +578,7 @@ void Stop(void) g_wiimotes[i]->EmuStop(); } +// called when the dolphin app exits void Shutdown(void) { g_wiimote_scanner.StopScanning(); From be76dc153b944d30c8ed648adcb3b4c4df1799e5 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Thu, 1 Aug 2013 07:16:51 -0500 Subject: [PATCH 3/3] Re-add the HandleWiimoteDisconnect calls to the RealWiimote::Shutdown routine. This is needed to actually disconnect real wiimotes and delete the corresponding wiimote objects when the app exits. --- Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp index d30e1b37c9..d2e7e2f57a 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp @@ -591,6 +591,9 @@ void Shutdown(void) NOTICE_LOG(WIIMOTE, "WiimoteReal::Shutdown"); g_real_wiimotes_initialized = false; + + for (unsigned int i = 0; i < MAX_BBMOTES; ++i) + HandleWiimoteDisconnect(i); } void Resume()