6#ifdef ROO_THREADS_USE_CPPSTD
9#include <condition_variable>
25class condition_variable {
28 condition_variable() noexcept : cond_() {}
30 condition_variable(
const condition_variable&) =
delete;
31 condition_variable& operator=(
const condition_variable&) =
delete;
34 void wait(unique_lock<mutex>& lock)
noexcept { cond_.wait(lock.lock_); }
37 template <
class Predicate>
38 void wait(unique_lock<mutex>& lock, Predicate pred) {
39 while (!pred()) wait(lock);
43 void notify_one() noexcept { cond_.notify_one(); }
46 void notify_all() noexcept { cond_.notify_all(); }
49 cv_status wait_until(unique_lock<mutex>& lock,
const roo_time::Uptime& when) {
50 return wait_for(lock, when - roo_time::Uptime::Now());
54 template <
typename Predicate>
55 bool wait_until(unique_lock<mutex>& lock,
const roo_time::Uptime& when,
58 if (wait_until(lock, when) == cv_status::timeout)
return p();
64 cv_status wait_for(unique_lock<mutex>& lock,
65 const roo_time::Duration& duration) {
66 static constexpr int64_t kMaxSafeWaitMicros = 10LL * 24 * 3600 * 1000000;
71 uint64_t micros = duration.inMicros() >= kMaxSafeWaitMicros
73 : duration.inMicros();
74 return cond_.wait_for(lock.lock_, std::chrono::microseconds(micros)) ==
75 std::cv_status::no_timeout
76 ? cv_status::no_timeout
82 template <
typename Predicate>
83 bool wait_for(unique_lock<mutex>& lock,
const roo_time::Duration& duration,
89 static constexpr int64_t kMaxSafeWaitMicros = 10LL * 24 * 3600 * 1000000;
90 int64_t wait_micros = duration.inMicros() < kMaxSafeWaitMicros
93 return cond_.wait_for(lock.lock_, std::chrono::microseconds(wait_micros),
98 std::condition_variable cond_;
cv_status
Status returned from timed wait operations.