mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-25 19:02:45 -06:00
Merge pull request #9677 from Morph1984/sleep-one
polyfill_thread: Implement StoppableTimedWait
This commit is contained in:
commit
2efe42fc93
3 changed files with 42 additions and 5 deletions
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
#ifdef __cpp_lib_jthread
|
#ifdef __cpp_lib_jthread
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
#include <stop_token>
|
#include <stop_token>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
@ -21,11 +23,23 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) {
|
||||||
cv.wait(lock, token, std::move(pred));
|
cv.wait(lock, token, std::move(pred));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period>
|
||||||
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
|
std::condition_variable_any cv;
|
||||||
|
std::mutex m;
|
||||||
|
|
||||||
|
// Perform the timed wait.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
return !cv.wait_for(lk, token, rel_time, [&] { return token.stop_requested(); });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -318,6 +332,28 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred pred) {
|
||||||
cv.wait(lock, [&] { return pred() || token.stop_requested(); });
|
cv.wait(lock, [&] { return pred() || token.stop_requested(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period>
|
||||||
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
|
if (token.stop_requested()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_requested = false;
|
||||||
|
std::condition_variable cv;
|
||||||
|
std::mutex m;
|
||||||
|
|
||||||
|
std::stop_callback cb(token, [&] {
|
||||||
|
// Wake up the waiting thread.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
stop_requested = true;
|
||||||
|
cv.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform the timed wait.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
return !cv.wait_for(lk, rel_time, [&] { return stop_requested; });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/param_package.h"
|
#include "common/param_package.h"
|
||||||
|
#include "common/polyfill_thread.h"
|
||||||
#include "common/settings_input.h"
|
#include "common/settings_input.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "input_common/drivers/gc_adapter.h"
|
#include "input_common/drivers/gc_adapter.h"
|
||||||
|
@ -217,8 +218,7 @@ void GCAdapter::AdapterScanThread(std::stop_token stop_token) {
|
||||||
Common::SetCurrentThreadName("ScanGCAdapter");
|
Common::SetCurrentThreadName("ScanGCAdapter");
|
||||||
usb_adapter_handle = nullptr;
|
usb_adapter_handle = nullptr;
|
||||||
pads = {};
|
pads = {};
|
||||||
while (!stop_token.stop_requested() && !Setup()) {
|
while (!Setup() && Common::StoppableTimedWait(stop_token, std::chrono::seconds{2})) {
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(2));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "common/param_package.h"
|
#include "common/param_package.h"
|
||||||
#include "common/polyfill_ranges.h"
|
#include "common/polyfill_ranges.h"
|
||||||
|
#include "common/polyfill_thread.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "input_common/drivers/joycon.h"
|
#include "input_common/drivers/joycon.h"
|
||||||
|
@ -67,7 +68,8 @@ void Joycons::Setup() {
|
||||||
void Joycons::ScanThread(std::stop_token stop_token) {
|
void Joycons::ScanThread(std::stop_token stop_token) {
|
||||||
constexpr u16 nintendo_vendor_id = 0x057e;
|
constexpr u16 nintendo_vendor_id = 0x057e;
|
||||||
Common::SetCurrentThreadName("JoyconScanThread");
|
Common::SetCurrentThreadName("JoyconScanThread");
|
||||||
while (!stop_token.stop_requested()) {
|
|
||||||
|
do {
|
||||||
SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0);
|
SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0);
|
||||||
SDL_hid_device_info* cur_dev = devs;
|
SDL_hid_device_info* cur_dev = devs;
|
||||||
|
|
||||||
|
@ -81,8 +83,7 @@ void Joycons::ScanThread(std::stop_token stop_token) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_hid_free_enumeration(devs);
|
SDL_hid_free_enumeration(devs);
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
} while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5}));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
|
bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
|
||||||
|
|
Loading…
Reference in a new issue