19 #include <condition_variable>
23 #include "priority_mutex.h"
28 typedef std::chrono::system_clock clock;
31 typedef std::condition_variable::native_handle_type native_handle_type;
40 void notify_one() noexcept {
41 std::lock_guard<std::mutex> lock(*m_mutex);
45 void notify_all() noexcept {
46 std::lock_guard<std::mutex> lock(*m_mutex);
50 template <
typename Lock>
51 void wait(Lock& _lock) {
52 std::shared_ptr<std::mutex> _mutex = m_mutex;
53 std::unique_lock<std::mutex> my_lock(*_mutex);
54 Unlock<Lock> unlock(_lock);
58 std::unique_lock<std::mutex> my_lock2(std::move(my_lock));
59 m_cond.wait(my_lock2);
62 template <
typename Lock,
typename Predicate>
63 void wait(Lock& lock, Predicate p) {
69 template <
typename Lock,
typename Clock,
typename Duration>
70 std::cv_status wait_until(
71 Lock& _lock,
const std::chrono::time_point<Clock, Duration>& atime) {
72 std::shared_ptr<std::mutex> _mutex = m_mutex;
73 std::unique_lock<std::mutex> my_lock(*_mutex);
74 Unlock<Lock> unlock(_lock);
78 std::unique_lock<std::mutex> my_lock2(std::move(my_lock));
79 return m_cond.wait_until(my_lock2, atime);
82 template <
typename Lock,
typename Clock,
typename Duration,
84 bool wait_until(Lock& lock,
85 const std::chrono::time_point<Clock, Duration>& atime,
88 if (wait_until(lock, atime) == std::cv_status::timeout) {
95 template <
typename Lock,
typename Rep,
typename Period>
96 std::cv_status wait_for(Lock& lock,
97 const std::chrono::duration<Rep, Period>& rtime) {
98 return wait_until(lock, clock::now() + rtime);
101 template <
typename Lock,
typename Rep,
typename Period,
typename Predicate>
102 bool wait_for(Lock& lock,
const std::chrono::duration<Rep, Period>& rtime,
104 return wait_until(lock, clock::now() + rtime, std::move(p));
107 native_handle_type native_handle() {
return m_cond.native_handle(); }
110 std::condition_variable m_cond;
111 std::shared_ptr<std::mutex> m_mutex;
114 template <
typename Lock>
116 explicit Unlock(Lock& lk) : m_lock(lk) { lk.unlock(); }
119 if (std::uncaught_exception()) {
129 Unlock(
const Unlock&) =
delete;
130 Unlock& operator=(
const Unlock&) =
delete;
139 #ifndef NAMESPACED_PRIORITY
Definition: priority_condition_variable.h:27