14 #include <condition_variable> 18 #include "priority_mutex.h" 22 #if defined(__linux__) && defined(WPI_HAVE_PRIORITY_MUTEX) 24 #define WPI_HAVE_PRIORITY_CONDITION_VARIABLE 1 26 class priority_condition_variable {
27 typedef std::chrono::system_clock clock;
30 typedef pthread_cond_t* native_handle_type;
32 priority_condition_variable() noexcept = default;
33 ~priority_condition_variable() noexcept { pthread_cond_destroy(&m_cond); }
35 priority_condition_variable(
const priority_condition_variable&) =
delete;
36 priority_condition_variable& operator=(
const priority_condition_variable&) =
39 void notify_one() noexcept { pthread_cond_signal(&m_cond); }
41 void notify_all() noexcept { pthread_cond_broadcast(&m_cond); }
43 void wait(std::unique_lock<priority_mutex>& lock) noexcept {
44 int e = pthread_cond_wait(&m_cond, lock.mutex()->native_handle());
45 if (e) std::terminate();
48 template <
typename Predicate>
49 void wait(std::unique_lock<priority_mutex>& lock, Predicate p) {
55 template <
typename Duration>
56 std::cv_status wait_until(
57 std::unique_lock<priority_mutex>& lock,
58 const std::chrono::time_point<clock, Duration>& atime) {
59 return wait_until_impl(lock, atime);
62 template <
typename Clock,
typename Duration>
63 std::cv_status wait_until(
64 std::unique_lock<priority_mutex>& lock,
65 const std::chrono::time_point<Clock, Duration>& atime) {
66 const typename Clock::time_point c_entry = Clock::now();
67 const clock::time_point s_entry = clock::now();
68 const auto delta = atime - c_entry;
69 const auto s_atime = s_entry + delta;
71 return wait_until_impl(lock, s_atime);
74 template <
typename Clock,
typename Duration,
typename Predicate>
75 bool wait_until(std::unique_lock<priority_mutex>& lock,
76 const std::chrono::time_point<Clock, Duration>& atime,
79 if (wait_until(lock, atime) == std::cv_status::timeout) {
86 template <
typename Rep,
typename Period>
87 std::cv_status wait_for(std::unique_lock<priority_mutex>& lock,
88 const std::chrono::duration<Rep, Period>& rtime) {
89 return wait_until(lock, clock::now() + rtime);
92 template <
typename Rep,
typename Period,
typename Predicate>
93 bool wait_for(std::unique_lock<priority_mutex>& lock,
94 const std::chrono::duration<Rep, Period>& rtime, Predicate p) {
95 return wait_until(lock, clock::now() + rtime, std::move(p));
98 native_handle_type native_handle() {
return &m_cond; }
101 pthread_cond_t m_cond = PTHREAD_COND_INITIALIZER;
103 template <
typename Dur>
104 std::cv_status wait_until_impl(
105 std::unique_lock<priority_mutex>& lock,
106 const std::chrono::time_point<clock, Dur>& atime) {
107 auto s = std::chrono::time_point_cast<std::chrono::seconds>(atime);
108 auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(atime - s);
110 struct timespec ts = {
111 static_cast<std::time_t
>(s.time_since_epoch().count()),
112 static_cast<long>(ns.count())};
114 pthread_cond_timedwait(&m_cond, lock.mutex()->native_handle(), &ts);
116 return (clock::now() < atime ? std::cv_status::no_timeout
117 : std::cv_status::timeout);
Definition: SocketError.cpp:17