|
|
|
@ -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 |