19#ifndef FASTDDS_UTILS__TIMEDCONDITIONVARIABLE_HPP
20#define FASTDDS_UTILS__TIMEDCONDITIONVARIABLE_HPP
22#include <fastdds/config.hpp>
43#if HAVE_STRICT_REALTIME && defined(__unix__)
46#define CV_INIT_(x) pthread_condattr_init(&cv_attr_); \
47 pthread_condattr_setclock(&cv_attr_, CLOCK_MONOTONIC); \
48 pthread_cond_init(x, &cv_attr_);
49#define CV_WAIT_(cv, x) pthread_cond_wait(&cv, x)
50#define CV_TIMEDWAIT_(cv, x, y) pthread_cond_timedwait(&cv, x, y)
51#define CV_SIGNAL_(cv) pthread_cond_signal(&cv)
52#define CV_BROADCAST_(cv) pthread_cond_broadcast(&cv)
53#define CV_T_ pthread_condattr_t cv_attr_; pthread_cond_t
55#include <condition_variable>
59#include <condition_variable>
66#if HAVE_STRICT_REALTIME && ( defined(__unix__))
77 template<
typename Mutex>
79 std::unique_lock<Mutex>& lock,
80 std::function<
bool()> predicate)
84 CV_WAIT_(cv_, lock.mutex()->native_handle());
88 template<
typename Mutex>
90 std::unique_lock<Mutex>& lock)
92 CV_WAIT_(cv_, lock.mutex()->native_handle());
95 template<
typename Mutex>
97 std::unique_lock<Mutex>& lock,
98 const std::chrono::nanoseconds& max_blocking_time,
99 std::function<
bool()> predicate)
101 bool ret_value =
true;
102 auto nsecs = max_blocking_time;
103 struct timespec max_wait = {
106 clock_gettime(CLOCK_MONOTONIC, &max_wait);
107 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
108 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
110 max_wait.tv_sec += secs.count();
111 max_wait.tv_nsec = (long)nsecs.count();
112 while (ret_value &&
false == (ret_value = predicate()))
114 ret_value = (0 == CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(), &max_wait));
120 template<
typename Mutex>
121 std::cv_status wait_for(
122 std::unique_lock<Mutex>& lock,
123 const std::chrono::nanoseconds& max_blocking_time)
125 auto nsecs = max_blocking_time;
126 struct timespec max_wait = {
129 clock_gettime(CLOCK_MONOTONIC, &max_wait);
130 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
131 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
133 max_wait.tv_sec += secs.count();
134 max_wait.tv_nsec = (long)nsecs.count();
135 return (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(),
136 &max_wait) == 0) ? std::cv_status::no_timeout :
std::cv_status::timeout;
139 template<
typename Mutex>
141 std::unique_lock<Mutex>& lock,
142 const std::chrono::steady_clock::time_point& max_blocking_time,
143 std::function<
bool()> predicate)
145 auto secs = std::chrono::time_point_cast<std::chrono::seconds>(max_blocking_time);
146 auto ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(max_blocking_time) -
147 std::chrono::time_point_cast<std::chrono::nanoseconds>(secs);
148 struct timespec max_wait = {
149 secs.time_since_epoch().count(), ns.count()
151 bool ret_value =
true;
152 while (ret_value &&
false == (ret_value = predicate()))
154 ret_value = (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(), &max_wait) == 0);
160 template<
typename Mutex>
161 std::cv_status wait_until(
162 std::unique_lock<Mutex>& lock,
163 const std::chrono::steady_clock::time_point& max_blocking_time)
165 auto secs = std::chrono::time_point_cast<std::chrono::seconds>(max_blocking_time);
166 auto ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(max_blocking_time) -
167 std::chrono::time_point_cast<std::chrono::nanoseconds>(secs);
168 struct timespec max_wait = {
169 secs.time_since_epoch().count(), ns.count()
171 return (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(),
172 &max_wait) == 0) ? std::cv_status::no_timeout : std::cv_status::timeout;
std::condition_variable_any TimedConditionVariable
Definition TimedConditionVariable.hpp:190
Definition EntityId_t.hpp:388