19 #include <condition_variable>
23 #include "priority_mutex.h"
26 typedef std::chrono::system_clock clock;
29 typedef std::condition_variable::native_handle_type native_handle_type;
38 void notify_one() noexcept {
39 std::lock_guard<std::mutex> lock(*m_mutex);
43 void notify_all() noexcept {
44 std::lock_guard<std::mutex> lock(*m_mutex);
48 template <
typename Lock>
49 void wait(Lock& _lock) {
50 std::shared_ptr<std::mutex> _mutex = m_mutex;
51 std::unique_lock<std::mutex> my_lock(*_mutex);
52 Unlock<Lock> unlock(_lock);
56 std::unique_lock<std::mutex> my_lock2(std::move(my_lock));
57 m_cond.wait(my_lock2);
60 template <
typename Lock,
typename Predicate>
61 void wait(Lock& lock, Predicate p) {
67 template <
typename Lock,
typename Clock,
typename Duration>
68 std::cv_status wait_until(
69 Lock& _lock,
const std::chrono::time_point<Clock, Duration>& atime) {
70 std::shared_ptr<std::mutex> _mutex = m_mutex;
71 std::unique_lock<std::mutex> my_lock(*_mutex);
72 Unlock<Lock> unlock(_lock);
76 std::unique_lock<std::mutex> my_lock2(std::move(my_lock));
77 return m_cond.wait_until(my_lock2, atime);
80 template <
typename Lock,
typename Clock,
typename Duration,
82 bool wait_until(Lock& lock,
83 const std::chrono::time_point<Clock, Duration>& atime,
86 if (wait_until(lock, atime) == std::cv_status::timeout) {
93 template <
typename Lock,
typename Rep,
typename Period>
94 std::cv_status wait_for(Lock& lock,
95 const std::chrono::duration<Rep, Period>& rtime) {
96 return wait_until(lock, clock::now() + rtime);
99 template <
typename Lock,
typename Rep,
typename Period,
typename Predicate>
100 bool wait_for(Lock& lock,
const std::chrono::duration<Rep, Period>& rtime,
102 return wait_until(lock, clock::now() + rtime, std::move(p));
105 native_handle_type native_handle() {
return m_cond.native_handle(); }
108 std::condition_variable m_cond;
109 std::shared_ptr<std::mutex> m_mutex;
112 template <
typename Lock>
114 explicit Unlock(Lock& lk) : m_lock(lk) { lk.unlock(); }
117 if (std::uncaught_exception()) {
127 Unlock(
const Unlock&) =
delete;
128 Unlock& operator=(
const Unlock&) =
delete;
Definition: priority_condition_variable.h:25