19#ifndef _UTILS_TIMEDMUTEX_HPP_
20#define _UTILS_TIMEDMUTEX_HPP_
27extern int clock_gettime(
30#elif _GTHREAD_USE_MUTEX_TIMEDLOCK
46 _Mtx_init(&mutex_, _Mtx_timed);
69 template <
class Rep,
class Period>
71 const std::chrono::duration<Rep, Period>& rel_time)
73 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
76 template <
class Clock,
class Duration>
78 const std::chrono::time_point<Clock, Duration>& abs_time)
80 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
82 if (0 < nsecs.count())
84 struct timespec max_wait = {
87 clock_gettime(1, &max_wait);
88 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
89 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
91 max_wait.tv_sec += secs.count();
92 max_wait.tv_nsec = (long)nsecs.count();
93 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
97 return (_Thrd_success == _Mtx_trylock(mutex_));
101 void* native_handle() noexcept
117 _Mtx_init(&mutex_, _Mtx_timed | _Mtx_recursive);
125 ~RecursiveTimedMutex()
127 _Mtx_destroy(mutex_);
142 return (_Thrd_success == _Mtx_trylock(mutex_));
145 template <
class Rep,
class Period>
147 const std::chrono::duration<Rep, Period>& rel_time)
149 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
152 template <
class Clock,
class Duration>
154 const std::chrono::time_point<Clock, Duration>& abs_time)
156 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
157 if (0 < nsecs.count())
159 struct timespec max_wait = {
162 clock_gettime(1, &max_wait);
163 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
164 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
166 max_wait.tv_sec += secs.count();
167 max_wait.tv_nsec = (long)nsecs.count();
168 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
172 return (_Thrd_success == _Mtx_trylock(mutex_));
176 void* native_handle() noexcept
185#elif _GTHREAD_USE_MUTEX_TIMEDLOCK || !defined(__unix__)
195 pthread_mutex_init(&mutex_,
nullptr);
205 pthread_mutex_destroy(&mutex_);
210 pthread_mutex_lock(&mutex_);
215 pthread_mutex_unlock(&mutex_);
218 template <
class Rep,
class Period>
220 const std::chrono::duration<Rep, Period>& rel_time)
222 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
225 template <
class Clock,
class Duration>
227 const std::chrono::time_point<Clock, Duration>& abs_time)
229 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
230 struct timespec max_wait = {
233 clock_gettime(CLOCK_REALTIME, &max_wait);
234 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
235 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
237 max_wait.tv_sec += secs.count();
238 max_wait.tv_nsec = (long)nsecs.count();
239 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
242 pthread_mutex_t* native_handle()
noexcept
249 pthread_mutex_t mutex_;
258 pthread_mutexattr_init(&mutex_attr_);
259 pthread_mutexattr_settype(&mutex_attr_, PTHREAD_MUTEX_RECURSIVE);
260 pthread_mutex_init(&mutex_, &mutex_attr_);
268 ~RecursiveTimedMutex()
270 pthread_mutex_destroy(&mutex_);
271 pthread_mutexattr_destroy(&mutex_attr_);
276 pthread_mutex_lock(&mutex_);
281 pthread_mutex_unlock(&mutex_);
286 return (0 == pthread_mutex_trylock(&mutex_));
289 template <
class Rep,
class Period>
291 const std::chrono::duration<Rep, Period>& rel_time)
293 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
296 template <
class Clock,
class Duration>
298 const std::chrono::time_point<Clock, Duration>& abs_time)
300 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
301 struct timespec max_wait = {
304 clock_gettime(CLOCK_REALTIME, &max_wait);
305 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
306 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
308 max_wait.tv_sec += secs.count();
309 max_wait.tv_nsec = (long)nsecs.count();
310 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
313 pthread_mutex_t* native_handle() noexcept
320 pthread_mutexattr_t mutex_attr_;
322 pthread_mutex_t mutex_;
std::recursive_timed_mutex RecursiveTimedMutex
Definition: TimedMutex.hpp:187
std::timed_mutex TimedMutex
Definition: TimedMutex.hpp:186
eProsima namespace.
Definition: LibrarySettingsAttributes.h:23