From d306397bbc64b51e891f689252f77c0cfa31983b Mon Sep 17 00:00:00 2001 From: Andrew Molloy Date: Sun, 3 Dec 2017 10:32:07 -0500 Subject: [PATCH 1/3] -[deviceInquiryComplete:error:aborted:] comes in on the main thread in macOS 10.13, so instead of using CFRunLoopRun()/CFRunLoopStop(), just let the run loop do one pass. This is already in a loop waiting for done to be false. This also means -[deviceInquiryComplete:error:aborted:] should no longer call CFRunLoopStop(). Fixes connecting to Wiimotes in macOS 10.13+, should continue to work as before in 10.12 and below. --- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index 0aada486c4..f0743dc6d6 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -54,7 +54,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, do { - CFRunLoopRun(); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); } while (!sbt->done); int found_devices = [[bti foundDevices] count]; @@ -255,7 +255,6 @@ void WiimoteDarwin::DisablePowerAssertionInternal() aborted:(BOOL)aborted { done = true; - CFRunLoopStop(CFRunLoopGetCurrent()); } - (void)deviceInquiryDeviceFound:(IOBluetoothDeviceInquiry*)sender device:(IOBluetoothDevice*)device From 8354e89cf1e1cd8b8bb5458820e4e1714d6cc89a Mon Sep 17 00:00:00 2001 From: Andrew Molloy Date: Sun, 3 Dec 2017 11:41:06 -0500 Subject: [PATCH 2/3] Break out of the loop waiting for the SearchBT to be done in WiimoteScannerDarwin::FindWiimotes() when the object is destroyed. Allows the application to quit correctly when Continuous Scanning is enabled on macOS. --- Source/Core/Core/HW/WiimoteReal/IOdarwin.h | 4 +++- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index 93a53dfe50..d15f85481d 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h @@ -13,10 +13,12 @@ class WiimoteScannerDarwin final : public WiimoteScannerBackend { public: WiimoteScannerDarwin() = default; - ~WiimoteScannerDarwin() override = default; + ~WiimoteScannerDarwin() override; bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed +private: + bool stopScanning = false; }; } diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index f0743dc6d6..dfb077c54e 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -21,6 +21,11 @@ namespace WiimoteReal { +WiimoteScannerDarwin::~WiimoteScannerDarwin() +{ + stopScanning = true; +} + void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, Wiimote*& found_board) { @@ -55,7 +60,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, do { CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); - } while (!sbt->done); + } while (!sbt->done && !stopScanning); int found_devices = [[bti foundDevices] count]; From f5839f854aa12194d024cc31ce6401eb2740c65a Mon Sep 17 00:00:00 2001 From: Andrew Molloy Date: Sun, 3 Dec 2017 12:31:18 -0500 Subject: [PATCH 3/3] Fix whitespace in and around WiimoteScannerDarwin::~WiimoteScannerDarwin() (linter). --- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index dfb077c54e..2b5df642dd 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -21,11 +21,11 @@ namespace WiimoteReal { -WiimoteScannerDarwin::~WiimoteScannerDarwin() +WiimoteScannerDarwin::~WiimoteScannerDarwin() { - stopScanning = true; + stopScanning = true; } - + void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, Wiimote*& found_board) {