diff options
| -rw-r--r-- | src/common/polyfill_thread.h | 36 | ||||
| -rw-r--r-- | src/input_common/drivers/gc_adapter.cpp | 4 | ||||
| -rw-r--r-- | src/input_common/drivers/joycon.cpp | 7 |
3 files changed, 42 insertions, 5 deletions
diff --git a/src/common/polyfill_thread.h b/src/common/polyfill_thread.h index 5a8d1ce08..b2c929d2f 100644 --- a/src/common/polyfill_thread.h +++ b/src/common/polyfill_thread.h | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | 11 | ||
| 12 | #ifdef __cpp_lib_jthread | 12 | #ifdef __cpp_lib_jthread |
| 13 | 13 | ||
| 14 | #include <chrono> | ||
| 15 | #include <condition_variable> | ||
| 14 | #include <stop_token> | 16 | #include <stop_token> |
| 15 | #include <thread> | 17 | #include <thread> |
| 16 | 18 | ||
| @@ -21,11 +23,23 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) { | |||
| 21 | cv.wait(lock, token, std::move(pred)); | 23 | cv.wait(lock, token, std::move(pred)); |
| 22 | } | 24 | } |
| 23 | 25 | ||
| 26 | template <typename Rep, typename Period> | ||
| 27 | bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) { | ||
| 28 | std::condition_variable_any cv; | ||
| 29 | std::mutex m; | ||
| 30 | |||
| 31 | // Perform the timed wait. | ||
| 32 | std::unique_lock lk{m}; | ||
| 33 | return !cv.wait_for(lk, token, rel_time, [&] { return token.stop_requested(); }); | ||
| 34 | } | ||
| 35 | |||
| 24 | } // namespace Common | 36 | } // namespace Common |
| 25 | 37 | ||
| 26 | #else | 38 | #else |
| 27 | 39 | ||
| 28 | #include <atomic> | 40 | #include <atomic> |
| 41 | #include <chrono> | ||
| 42 | #include <condition_variable> | ||
| 29 | #include <functional> | 43 | #include <functional> |
| 30 | #include <list> | 44 | #include <list> |
| 31 | #include <memory> | 45 | #include <memory> |
| @@ -318,6 +332,28 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred pred) { | |||
| 318 | cv.wait(lock, [&] { return pred() || token.stop_requested(); }); | 332 | cv.wait(lock, [&] { return pred() || token.stop_requested(); }); |
| 319 | } | 333 | } |
| 320 | 334 | ||
| 335 | template <typename Rep, typename Period> | ||
| 336 | bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) { | ||
| 337 | if (token.stop_requested()) { | ||
| 338 | return false; | ||
| 339 | } | ||
| 340 | |||
| 341 | bool stop_requested = false; | ||
| 342 | std::condition_variable cv; | ||
| 343 | std::mutex m; | ||
| 344 | |||
| 345 | std::stop_callback cb(token, [&] { | ||
| 346 | // Wake up the waiting thread. | ||
| 347 | std::unique_lock lk{m}; | ||
| 348 | stop_requested = true; | ||
| 349 | cv.notify_one(); | ||
| 350 | }); | ||
| 351 | |||
| 352 | // Perform the timed wait. | ||
| 353 | std::unique_lock lk{m}; | ||
| 354 | return !cv.wait_for(lk, rel_time, [&] { return stop_requested; }); | ||
| 355 | } | ||
| 356 | |||
| 321 | } // namespace Common | 357 | } // namespace Common |
| 322 | 358 | ||
| 323 | #endif | 359 | #endif |
diff --git a/src/input_common/drivers/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp index ecb3e9dc2..d09ff178b 100644 --- a/src/input_common/drivers/gc_adapter.cpp +++ b/src/input_common/drivers/gc_adapter.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| 8 | #include "common/param_package.h" | 8 | #include "common/param_package.h" |
| 9 | #include "common/polyfill_thread.h" | ||
| 9 | #include "common/settings_input.h" | 10 | #include "common/settings_input.h" |
| 10 | #include "common/thread.h" | 11 | #include "common/thread.h" |
| 11 | #include "input_common/drivers/gc_adapter.h" | 12 | #include "input_common/drivers/gc_adapter.h" |
| @@ -217,8 +218,7 @@ void GCAdapter::AdapterScanThread(std::stop_token stop_token) { | |||
| 217 | Common::SetCurrentThreadName("ScanGCAdapter"); | 218 | Common::SetCurrentThreadName("ScanGCAdapter"); |
| 218 | usb_adapter_handle = nullptr; | 219 | usb_adapter_handle = nullptr; |
| 219 | pads = {}; | 220 | pads = {}; |
| 220 | while (!stop_token.stop_requested() && !Setup()) { | 221 | while (!Setup() && Common::StoppableTimedWait(stop_token, std::chrono::seconds{2})) { |
| 221 | std::this_thread::sleep_for(std::chrono::seconds(2)); | ||
| 222 | } | 222 | } |
| 223 | } | 223 | } |
| 224 | 224 | ||
diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 40cda400d..cedc94e63 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include "common/param_package.h" | 6 | #include "common/param_package.h" |
| 7 | #include "common/polyfill_ranges.h" | 7 | #include "common/polyfill_ranges.h" |
| 8 | #include "common/polyfill_thread.h" | ||
| 8 | #include "common/settings.h" | 9 | #include "common/settings.h" |
| 9 | #include "common/thread.h" | 10 | #include "common/thread.h" |
| 10 | #include "input_common/drivers/joycon.h" | 11 | #include "input_common/drivers/joycon.h" |
| @@ -67,7 +68,8 @@ void Joycons::Setup() { | |||
| 67 | void Joycons::ScanThread(std::stop_token stop_token) { | 68 | void Joycons::ScanThread(std::stop_token stop_token) { |
| 68 | constexpr u16 nintendo_vendor_id = 0x057e; | 69 | constexpr u16 nintendo_vendor_id = 0x057e; |
| 69 | Common::SetCurrentThreadName("JoyconScanThread"); | 70 | Common::SetCurrentThreadName("JoyconScanThread"); |
| 70 | while (!stop_token.stop_requested()) { | 71 | |
| 72 | do { | ||
| 71 | SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); | 73 | SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); |
| 72 | SDL_hid_device_info* cur_dev = devs; | 74 | SDL_hid_device_info* cur_dev = devs; |
| 73 | 75 | ||
| @@ -81,8 +83,7 @@ void Joycons::ScanThread(std::stop_token stop_token) { | |||
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | SDL_hid_free_enumeration(devs); | 85 | SDL_hid_free_enumeration(devs); |
| 84 | std::this_thread::sleep_for(std::chrono::seconds(5)); | 86 | } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); |
| 85 | } | ||
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { | 89 | bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { |