9 #ifndef LIBPMEMOBJ_CPP_TIMED_MUTEX_HPP
10 #define LIBPMEMOBJ_CPP_TIMED_MUTEX_HPP
15 #include <libpmemobj/thread.h>
33 typedef std::chrono::system_clock clock_type;
47 if ((pop = pmemobj_pool_by_ptr(&
plock)) ==
nullptr)
49 1, std::generic_category(),
50 "Persistent mutex not from persistent memory.");
52 pmemobj_mutex_zero(pop, &
plock);
74 PMEMobjpool *pop = pmemobj_pool_by_ptr(
this);
75 if (
int ret = pmemobj_mutex_lock(pop, &this->
plock))
77 "Failed to lock a mutex.")
78 .with_pmemobj_errormsg();
98 PMEMobjpool *pop = pmemobj_pool_by_ptr(
this);
99 int ret = pmemobj_mutex_trylock(pop, &this->
plock);
103 else if (ret == EBUSY)
107 "Failed to lock a mutex.")
108 .with_pmemobj_errormsg();
128 template <
typename Clock,
typename Duration>
131 const std::chrono::time_point<Clock, Duration> &timeout_time)
153 template <
typename Rep,
typename Period>
155 try_lock_for(
const std::chrono::duration<Rep, Period> &timeout_duration)
170 PMEMobjpool *pop = pmemobj_pool_by_ptr(
this);
171 int ret = pmemobj_mutex_unlock(pop, &this->
plock);
174 "Failed to unlock a mutex.")
175 .with_pmemobj_errormsg();
203 template <
typename Clock,
typename Duration>
207 PMEMobjpool *pop = pmemobj_pool_by_ptr(
this);
210 const typename Clock::time_point their_now = Clock::now();
211 const clock_type::time_point my_now = clock_type::now();
212 const auto delta = abs_time - their_now;
213 const auto my_abs = my_now + delta;
217 auto ret = pmemobj_mutex_timedlock(pop, &this->
plock, &ts);
221 else if (ret == ETIMEDOUT)
225 "Failed to lock a mutex");