6#ifdef ROO_THREADS_USE_CPPSTD
18using mutex = std::mutex;
23template <
typename Mutex>
24using lock_guard = ::std::lock_guard<Mutex>;
28using defer_lock_t = std::defer_lock_t;
31using try_to_lock_t = std::try_to_lock_t;
34using adopt_lock_t = std::adopt_lock_t;
36#if __cplusplus > 201402L
37inline constexpr defer_lock_t defer_lock{};
38inline constexpr try_to_lock_t try_to_lock{};
39inline constexpr adopt_lock_t adopt_lock{};
41constexpr defer_lock_t defer_lock{};
42constexpr try_to_lock_t try_to_lock{};
43constexpr adopt_lock_t adopt_lock{};
46template <
typename Mutex>
50 typedef Mutex mutex_type;
53 unique_lock() noexcept : lock_() {}
56 explicit unique_lock(mutex_type& mutex) : lock_(mutex) {}
60 unique_lock(mutex_type& mutex, defer_lock_t) noexcept
61 : lock_(mutex, std::defer_lock) {}
65 unique_lock(mutex_type& mutex, try_to_lock_t)
66 : lock_(mutex, std::try_to_lock) {}
70 unique_lock(mutex_type& mutex, adopt_lock_t) noexcept
71 : lock_(mutex, std::adopt_lock) {}
75 unique_lock(mutex_type& mutex, roo_time::Uptime tp)
76 : lock_(mutex, tp - roo_time::Uptime::Now()) {}
80 unique_lock(mutex_type& mutex, roo_time::Duration duration)
81 : lock_(mutex, std::chrono::microseconds(duration.inMicros())) {}
83 unique_lock(
const unique_lock&) =
delete;
84 unique_lock& operator=(
const unique_lock&) =
delete;
87 unique_lock(unique_lock&& lock) noexcept : lock_(std::move(lock.lock_)) {}
90 unique_lock& operator=(unique_lock&& lock)
noexcept {
91 lock_ = std::move(lock.lock_);
96 void lock() { lock_.lock(); }
99 bool try_lock() {
return lock_.try_lock(); }
102 bool try_lock_until(roo_time::Uptime tp) {
103 return try_lock_for(tp - roo_time::Uptime::Now());
107 bool try_lock_for(roo_time::Duration duration) {
108 return lock_.try_lock_for(std::chrono::microseconds(duration.inMicros()));
112 void unlock() { lock_.unlock(); }
115 void swap(unique_lock& other)
noexcept { lock_.swap(other.lock_); }
118 mutex_type* release() noexcept {
return lock_.release(); }
121 bool owns_lock() const noexcept {
return lock_.owns_lock(); }
124 explicit operator bool() const noexcept {
return lock_; }
127 mutex_type* mutex() const noexcept {
return lock_.mutex(); }
130 friend class condition_variable;
132 std::unique_lock<Mutex> lock_;