|
|
|
@ -11,6 +11,8 @@
|
|
|
|
|
|
|
|
|
|
#ifdef __cpp_lib_jthread
|
|
|
|
|
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <condition_variable>
|
|
|
|
|
#include <stop_token>
|
|
|
|
|
#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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
#include <atomic>
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <condition_variable>
|
|
|
|
|
#include <functional>
|
|
|
|
|
#include <list>
|
|
|
|
|
#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(); });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|