19#ifndef _UTILS_TIMEDCONDITIONVARIABLE_HPP_
20#define _UTILS_TIMEDCONDITIONVARIABLE_HPP_
21#include <fastrtps/config.h>
42#if HAVE_STRICT_REALTIME && defined(__unix__)
45#define CV_INIT_(x) pthread_condattr_init(&cv_attr_); \
46 pthread_condattr_setclock(&cv_attr_, CLOCK_MONOTONIC); \
47 pthread_cond_init(x, &cv_attr_);
48#define CV_WAIT_(cv, x) pthread_cond_wait(&cv, x)
49#define CV_TIMEDWAIT_(cv, x, y) pthread_cond_timedwait(&cv, x, y)
50#define CV_SIGNAL_(cv) pthread_cond_signal(&cv)
51#define CV_BROADCAST_(cv) pthread_cond_broadcast(&cv)
52#define CV_T_ pthread_condattr_t cv_attr_; pthread_cond_t
54#include <condition_variable>
58#include <condition_variable>
65#if HAVE_STRICT_REALTIME && ( defined(__unix__))
76 template<
typename Mutex>
78 std::unique_lock<Mutex>& lock,
79 std::function<
bool()> predicate)
83 CV_WAIT_(cv_, lock.mutex()->native_handle());
87 template<
typename Mutex>
89 std::unique_lock<Mutex>& lock)
91 CV_WAIT_(cv_, lock.mutex()->native_handle());
94 template<
typename Mutex>
96 std::unique_lock<Mutex>& lock,
97 const std::chrono::nanoseconds& max_blocking_time,
98 std::function<
bool()> predicate)
100 bool ret_value =
true;
101 auto nsecs = max_blocking_time;
102 struct timespec max_wait = {
105 clock_gettime(CLOCK_MONOTONIC, &max_wait);
106 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
107 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
109 max_wait.tv_sec += secs.count();
110 max_wait.tv_nsec = (long)nsecs.count();
111 while (ret_value &&
false == (ret_value = predicate()))
113 ret_value = (0 == CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(), &max_wait));
119 template<
typename Mutex>
120 std::cv_status wait_for(
121 std::unique_lock<Mutex>& lock,
122 const std::chrono::nanoseconds& max_blocking_time)
124 auto nsecs = max_blocking_time;
125 struct timespec max_wait = {
128 clock_gettime(CLOCK_MONOTONIC, &max_wait);
129 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
130 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
132 max_wait.tv_sec += secs.count();
133 max_wait.tv_nsec = (long)nsecs.count();
134 return (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(),
135 &max_wait) == 0) ? std::cv_status::no_timeout : std::cv_status::timeout;
138 template<
typename Mutex>
140 std::unique_lock<Mutex>& lock,
141 const std::chrono::steady_clock::time_point& max_blocking_time,
142 std::function<
bool()> predicate)
144 auto secs = std::chrono::time_point_cast<std::chrono::seconds>(max_blocking_time);
145 auto ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(max_blocking_time) -
146 std::chrono::time_point_cast<std::chrono::nanoseconds>(secs);
147 struct timespec max_wait = {
148 secs.time_since_epoch().count(), ns.count()
150 bool ret_value =
true;
151 while (ret_value &&
false == (ret_value = predicate()))
153 ret_value = (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(), &max_wait) == 0);
159 template<
typename Mutex>
160 std::cv_status wait_until(
161 std::unique_lock<Mutex>& lock,
162 const std::chrono::steady_clock::time_point& max_blocking_time)
164 auto secs = std::chrono::time_point_cast<std::chrono::seconds>(max_blocking_time);
165 auto ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(max_blocking_time) -
166 std::chrono::time_point_cast<std::chrono::nanoseconds>(secs);
167 struct timespec max_wait = {
168 secs.time_since_epoch().count(), ns.count()
170 return (CV_TIMEDWAIT_(cv_, lock.mutex()->native_handle(),
171 &max_wait) == 0) ? std::cv_status::no_timeout : std::cv_status::timeout;
std::condition_variable_any TimedConditionVariable
Definition TimedConditionVariable.hpp:189
eProsima namespace.
Definition LibrarySettingsAttributes.h:23