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(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 = { 0, 0 };
85 clock_gettime(1, &max_wait);
86 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
87 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
89 max_wait.tv_sec += secs.count();
90 max_wait.tv_nsec = (long)nsecs.count();
91 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
95 return (_Thrd_success == _Mtx_trylock(mutex_));
99 void* native_handle() noexcept
115 _Mtx_init(&mutex_, _Mtx_timed | _Mtx_recursive);
125 _Mtx_destroy(mutex_);
138 template <
class Rep,
class Period>
140 const std::chrono::duration<Rep, Period>& rel_time)
142 return try_lock_until(chrono::steady_clock::now() + rel_time);
145 template <
class Clock,
class Duration>
147 const std::chrono::time_point<Clock, Duration>& abs_time)
149 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
150 if (0 < nsecs.count())
152 struct timespec max_wait = { 0, 0 };
153 clock_gettime(1, &max_wait);
154 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
155 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
157 max_wait.tv_sec += secs.count();
158 max_wait.tv_nsec = (long)nsecs.count();
159 return (_Thrd_success == _Mtx_timedlock(mutex_, (xtime*)&max_wait));
163 return (_Thrd_success == _Mtx_trylock(mutex_));
167 void* native_handle() noexcept
176 #elif _GTHREAD_USE_MUTEX_TIMEDLOCK || !defined(__linux__)
186 pthread_mutex_init(&mutex_,
nullptr);
196 pthread_mutex_destroy(&mutex_);
201 pthread_mutex_lock(&mutex_);
206 pthread_mutex_unlock(&mutex_);
209 template <
class Rep,
class Period>
211 const std::chrono::duration<Rep, Period>& rel_time)
213 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
216 template <
class Clock,
class Duration>
218 const std::chrono::time_point<Clock, Duration>& abs_time)
220 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
221 struct timespec max_wait = { 0, 0 };
222 clock_gettime(CLOCK_REALTIME, &max_wait);
223 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
224 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
226 max_wait.tv_sec += secs.count();
227 max_wait.tv_nsec = (long)nsecs.count();
228 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
231 pthread_mutex_t* native_handle() noexcept
238 pthread_mutex_t mutex_;
247 pthread_mutexattr_init(&mutex_attr_);
248 pthread_mutexattr_settype(&mutex_attr_, PTHREAD_MUTEX_RECURSIVE);
249 pthread_mutex_init(&mutex_, &mutex_attr_);
259 pthread_mutex_destroy(&mutex_);
260 pthread_mutexattr_destroy(&mutex_attr_);
265 pthread_mutex_lock(&mutex_);
270 pthread_mutex_unlock(&mutex_);
273 template <
class Rep,
class Period>
275 const std::chrono::duration<Rep, Period>& rel_time)
277 return try_lock_until(std::chrono::steady_clock::now() + rel_time);
280 template <
class Clock,
class Duration>
282 const std::chrono::time_point<Clock, Duration>& abs_time)
284 std::chrono::nanoseconds nsecs = abs_time - std::chrono::steady_clock::now();
285 struct timespec max_wait = { 0, 0 };
286 clock_gettime(CLOCK_REALTIME, &max_wait);
287 nsecs = nsecs + std::chrono::nanoseconds(max_wait.tv_nsec);
288 auto secs = std::chrono::duration_cast<std::chrono::seconds>(nsecs);
290 max_wait.tv_sec += secs.count();
291 max_wait.tv_nsec = (long)nsecs.count();
292 return (0 == pthread_mutex_timedlock(&mutex_, &max_wait));
295 pthread_mutex_t* native_handle() noexcept
302 pthread_mutexattr_t mutex_attr_;
304 pthread_mutex_t mutex_;
std::recursive_timed_mutex RecursiveTimedMutex
Definition: TimedMutex.hpp:178
std::timed_mutex TimedMutex
Definition: TimedMutex.hpp:177
eProsima namespace.
Definition: LibrarySettingsAttributes.h:23