19#ifndef _UTILS_TIMEDMUTEX_HPP_
20#define _UTILS_TIMEDMUTEX_HPP_
27extern int clock_gettime(
30#elif _GTHREAD_USE_MUTEX_TIMEDLOCK
46#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 193632528
47 using xtime = _timespec64;
54 _Mtx_init(&mutex_, _Mtx_timed);
77 template <
class Rep,
class Period>
79 const std::chrono::duration<Rep, Period>& rel_time)
81 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
84 template <
class Clock,
class Duration>
86 const std::chrono::time_point<Clock, Duration>& abs_time)
88 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
90 if (0 < nsecs.count())
92 struct timespec max_wait = {
95 clock_gettime(1, &max_wait);
96 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
97 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
99 max_wait.tv_sec += secs.count();
100 max_wait.tv_nsec = (long)nsecs.count();
101 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
105 return (_Thrd_success == _Mtx_trylock(mutex_));
109 void* native_handle() noexcept
125 _Mtx_init(&mutex_, _Mtx_timed | _Mtx_recursive);
133 ~RecursiveTimedMutex()
135 _Mtx_destroy(mutex_);
150 return (_Thrd_success == _Mtx_trylock(mutex_));
153 template <
class Rep,
class Period>
155 const std::chrono::duration<Rep, Period>& rel_time)
157 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
160 template <
class Clock,
class Duration>
162 const std::chrono::time_point<Clock, Duration>& abs_time)
164 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
165 if (0 < nsecs.count())
167 struct timespec max_wait = {
170 clock_gettime(1, &max_wait);
171 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
172 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
174 max_wait.tv_sec += secs.count();
175 max_wait.tv_nsec = (long)nsecs.count();
176 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
180 return (_Thrd_success == _Mtx_trylock(mutex_));
184 void* native_handle() noexcept
193#elif _GTHREAD_USE_MUTEX_TIMEDLOCK || !defined(__unix__)
203 pthread_mutex_init(&mutex_,
nullptr);
213 pthread_mutex_destroy(&mutex_);
218 pthread_mutex_lock(&mutex_);
223 pthread_mutex_unlock(&mutex_);
226 template <
class Rep,
class Period>
228 const std::chrono::duration<Rep, Period>& rel_time)
230 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
233 template <
class Clock,
class Duration>
235 const std::chrono::time_point<Clock, Duration>& abs_time)
237 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
238 struct timespec max_wait = {
241 clock_gettime(CLOCK_REALTIME, &max_wait);
242 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
243 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
245 max_wait.tv_sec += secs.count();
246 max_wait.tv_nsec = (long)nsecs.count();
247 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
250 pthread_mutex_t* native_handle()
noexcept
257 pthread_mutex_t mutex_;
266 pthread_mutexattr_init(&mutex_attr_);
267 pthread_mutexattr_settype(&mutex_attr_, PTHREAD_MUTEX_RECURSIVE);
268 pthread_mutex_init(&mutex_, &mutex_attr_);
276 ~RecursiveTimedMutex()
278 pthread_mutex_destroy(&mutex_);
279 pthread_mutexattr_destroy(&mutex_attr_);
284 pthread_mutex_lock(&mutex_);
289 pthread_mutex_unlock(&mutex_);
294 return (0 == pthread_mutex_trylock(&mutex_));
297 template <
class Rep,
class Period>
299 const std::chrono::duration<Rep, Period>& rel_time)
301 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
304 template <
class Clock,
class Duration>
306 const std::chrono::time_point<Clock, Duration>& abs_time)
308 std::chrono::nanoseconds nsecs = abs_time - Clock::now();
309 struct timespec max_wait = {
312 clock_gettime(CLOCK_REALTIME, &max_wait);
313 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
314 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
316 max_wait.tv_sec += secs.count();
317 max_wait.tv_nsec = (long)nsecs.count();
318 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
321 pthread_mutex_t* native_handle() noexcept
328 pthread_mutexattr_t mutex_attr_;
330 pthread_mutex_t mutex_;
std::recursive_timed_mutex RecursiveTimedMutex
Definition TimedMutex.hpp:195
std::timed_mutex TimedMutex
Definition TimedMutex.hpp:194
eProsima namespace.
Definition LibrarySettingsAttributes.h:23