6#ifdef ROO_THREADS_SINGLETHREADED
8#include "roo_backport.h"
9#include "roo_backport/move.h"
13namespace singlethreaded {
21 mutex() noexcept = default;
24 mutex(const mutex&) = delete;
25 mutex& operator=(const mutex&) = delete;
30 bool try_lock() {
return true; }
36template <
typename Mutex>
40 typedef Mutex mutex_type;
43 explicit lock_guard(mutex_type& mutex) {}
45 lock_guard(
const lock_guard&) =
delete;
46 lock_guard& operator=(
const lock_guard&) =
delete;
53 explicit defer_lock_t() =
default;
60 explicit try_to_lock_t() =
default;
68 explicit adopt_lock_t() =
default;
71#if __cplusplus > 201402L
72inline constexpr defer_lock_t defer_lock{};
73inline constexpr try_to_lock_t try_to_lock{};
74inline constexpr adopt_lock_t adopt_lock{};
76constexpr defer_lock_t defer_lock{};
77constexpr try_to_lock_t try_to_lock{};
78constexpr adopt_lock_t adopt_lock{};
81template <
typename Mutex>
85 typedef Mutex mutex_type;
88 unique_lock() noexcept : lock_(
nullptr), owns_(false) {}
91 explicit unique_lock(mutex_type& mutex) : lock_(&mutex), owns_(false) {
97 unique_lock(mutex_type& mutex, defer_lock_t) noexcept
98 : lock_(&mutex), owns_(
false) {}
102 unique_lock(mutex_type& mutex, try_to_lock_t)
103 : lock_(&mutex), owns_(lock_->try_lock()) {}
107 unique_lock(mutex_type& mutex, adopt_lock_t) noexcept
108 : lock_(&mutex), owns_(
true) {}
112 unique_lock(mutex_type& mutex,
const roo_time::Uptime& tp)
113 : lock_(&mutex), owns_(lock_->try_lock_until(tp)) {}
117 unique_lock(mutex_type& mutex,
const roo_time::Duration& duration)
118 : lock_(&mutex), owns_(lock_->try_lock_for(duration)) {}
125 unique_lock(
const unique_lock&) =
delete;
126 unique_lock& operator=(
const unique_lock&) =
delete;
129 unique_lock(unique_lock&& lock) noexcept
130 : lock_(lock.lock_), owns_(lock.owns_) {
136 unique_lock& operator=(unique_lock&& lock)
noexcept {
139 unique_lock(roo::move(lock)).swap(*
this);
155 owns_ = lock_->try_lock();
160 bool try_lock_until(
const roo_time::Uptime& tp) {
161 owns_ = lock_->try_lock_until(tp);
166 bool try_lock_for(
const roo_time::Duration& duration) {
167 owns_ = lock_->try_lock_for(duration);
173 if (lock_ !=
nullptr) {
180 void swap(unique_lock& other)
noexcept {
181 std::swap(lock_, other.lock_);
182 std::swap(owns_, other.owns_);
186 mutex_type* release() noexcept {
187 mutex_type* ret = lock_;
194 bool owns_lock() const noexcept {
return owns_; }
197 explicit operator bool() const noexcept {
return owns_lock(); }
200 mutex_type* mutex() const noexcept {
return lock_; }