19#ifndef _UTILS_TIMEDMUTEX_HPP_
20#define _UTILS_TIMEDMUTEX_HPP_
27#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 193632528
31extern int clock_gettime(
36#elif _GTHREAD_USE_MUTEX_TIMEDLOCK
47#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 193632528
58 _Mtx_init(&mutex_, _Mtx_timed);
81 template <
class Rep,
class Period>
83 const std::chrono::duration<Rep, Period>& rel_time)
85 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
88 template <
class Clock,
class Duration>
90 const std::chrono::time_point<Clock, Duration>& abs_time)
92 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
94 if (0 < nsecs.count())
96 struct timespec max_wait = {
99 clock_gettime(1, &max_wait);
100 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
101 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
103 max_wait.tv_sec += secs.count();
104 max_wait.tv_nsec = (long)nsecs.count();
105 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
109 return (_Thrd_success == _Mtx_trylock(mutex_));
113 void* native_handle() noexcept
129 _Mtx_init(&mutex_, _Mtx_timed | _Mtx_recursive);
137 ~RecursiveTimedMutex()
139 _Mtx_destroy(mutex_);
154 return (_Thrd_success == _Mtx_trylock(mutex_));
157 template <
class Rep,
class Period>
159 const std::chrono::duration<Rep, Period>& rel_time)
161 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
164 template <
class Clock,
class Duration>
166 const std::chrono::time_point<Clock, Duration>& abs_time)
168 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
169 if (0 < nsecs.count())
171 struct timespec max_wait = {
174 clock_gettime(1, &max_wait);
175 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
176 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
178 max_wait.tv_sec += secs.count();
179 max_wait.tv_nsec = (long)nsecs.count();
180 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
184 return (_Thrd_success == _Mtx_trylock(mutex_));
188 void* native_handle() noexcept
199#elif _GTHREAD_USE_MUTEX_TIMEDLOCK || !defined(__unix__)
209 pthread_mutex_init(&mutex_,
nullptr);
219 pthread_mutex_destroy(&mutex_);
224 pthread_mutex_lock(&mutex_);
229 pthread_mutex_unlock(&mutex_);
232 template <
class Rep,
class Period>
234 const std::chrono::duration<Rep, Period>& rel_time)
236 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
239 template <
class Clock,
class Duration>
241 const std::chrono::time_point<Clock, Duration>& abs_time)
243 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
244 struct timespec max_wait = {
247 clock_gettime(CLOCK_REALTIME, &max_wait);
248 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
249 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
251 max_wait.tv_sec += secs.count();
252 max_wait.tv_nsec = (long)nsecs.count();
253 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
256 pthread_mutex_t* native_handle()
noexcept
263 pthread_mutex_t mutex_;
272 pthread_mutexattr_init(&mutex_attr_);
273 pthread_mutexattr_settype(&mutex_attr_, PTHREAD_MUTEX_RECURSIVE);
274 pthread_mutex_init(&mutex_, &mutex_attr_);
282 ~RecursiveTimedMutex()
284 pthread_mutex_destroy(&mutex_);
285 pthread_mutexattr_destroy(&mutex_attr_);
290 pthread_mutex_lock(&mutex_);
295 pthread_mutex_unlock(&mutex_);
300 return (0 == pthread_mutex_trylock(&mutex_));
303 template <
class Rep,
class Period>
305 const std::chrono::duration<Rep, Period>& rel_time)
307 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
310 template <
class Clock,
class Duration>
312 const std::chrono::time_point<Clock, Duration>& abs_time)
314 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
315 struct timespec max_wait = {
318 clock_gettime(CLOCK_REALTIME, &max_wait);
319 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
320 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
322 max_wait.tv_sec += secs.count();
323 max_wait.tv_nsec = (long)nsecs.count();
324 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
327 pthread_mutex_t* native_handle() noexcept
334 pthread_mutexattr_t mutex_attr_;
336 pthread_mutex_t mutex_;
std::recursive_timed_mutex RecursiveTimedMutex
Definition TimedMutex.hpp:201
std::timed_mutex TimedMutex
Definition TimedMutex.hpp:200
eProsima namespace.
Definition LibrarySettingsAttributes.h:23