19 #ifndef _UTILS_TIMEDMUTEX_HPP_
20 #define _UTILS_TIMEDMUTEX_HPP_
27 extern 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 - std::chrono::steady_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);
127 _Mtx_destroy(mutex_);
140 template <
class Rep,
class Period>
142 const std::chrono::duration<Rep, Period>& rel_time)
144 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
147 template <
class Clock,
class Duration>
149 const std::chrono::time_point<Clock, Duration>& abs_time)
151 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
152 if (0 < nsecs.count())
154 struct timespec max_wait = {
157 clock_gettime(1, &max_wait);
158 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
159 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
161 max_wait.tv_sec += secs.count();
162 max_wait.tv_nsec = (long)nsecs.count();
163 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
167 return (_Thrd_success == _Mtx_trylock(mutex_));
171 void* native_handle() noexcept
180 #elif _GTHREAD_USE_MUTEX_TIMEDLOCK || !defined(__linux__)
190 pthread_mutex_init(&mutex_,
nullptr);
200 pthread_mutex_destroy(&mutex_);
205 pthread_mutex_lock(&mutex_);
210 pthread_mutex_unlock(&mutex_);
213 template <
class Rep,
class Period>
215 const std::chrono::duration<Rep, Period>& rel_time)
217 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
220 template <
class Clock,
class Duration>
222 const std::chrono::time_point<Clock, Duration>& abs_time)
224 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
225 struct timespec max_wait = {
228 clock_gettime(CLOCK_REALTIME, &max_wait);
229 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
230 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
232 max_wait.tv_sec += secs.count();
233 max_wait.tv_nsec = (long)nsecs.count();
234 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
237 pthread_mutex_t* native_handle() noexcept
244 pthread_mutex_t mutex_;
253 pthread_mutexattr_init(&mutex_attr_);
254 pthread_mutexattr_settype(&mutex_attr_, PTHREAD_MUTEX_RECURSIVE);
255 pthread_mutex_init(&mutex_, &mutex_attr_);
265 pthread_mutex_destroy(&mutex_);
266 pthread_mutexattr_destroy(&mutex_attr_);
271 pthread_mutex_lock(&mutex_);
276 pthread_mutex_unlock(&mutex_);
279 template <
class Rep,
class Period>
281 const std::chrono::duration<Rep, Period>& rel_time)
283 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
286 template <
class Clock,
class Duration>
288 const std::chrono::time_point<Clock, Duration>& abs_time)
290 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
291 struct timespec max_wait = {
294 clock_gettime(CLOCK_REALTIME, &max_wait);
295 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
296 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
298 max_wait.tv_sec += secs.count();
299 max_wait.tv_nsec = (long)nsecs.count();
300 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
303 pthread_mutex_t* native_handle() noexcept
310 pthread_mutexattr_t mutex_attr_;
312 pthread_mutex_t mutex_;
std::recursive_timed_mutex RecursiveTimedMutex
Definition: TimedMutex.hpp:182
std::timed_mutex TimedMutex
Definition: TimedMutex.hpp:181
eProsima namespace.
Definition: LibrarySettingsAttributes.h:23