21 template<
class L>
inline constexpr
35 return rw_lk.unlock();
44 template<
class T>
inline constexpr
46 : rw_lk(l), exclusive_w_lk(rw_lk.writer_lk), decayed(
false) {
52 exclusive_w_lk.lock();
53 const typename atomic_t::atomic_state_type ret=rw_lk.readers_free.lock();
54 assert(ret==lock_traits::atom_set);
55 assert(rw_lk.readers==0);
68 exclusive_w_lk.unlock();
70 const typename atomic_t::atomic_state_type ret=rw_lk.readers_free.set();
71 assert(ret==lock_traits::atom_set);
74 if ((--rw_lk.readers)==0) {
75 rw_lk.readers=
typename atomic_t::atomic_counter_type(0);
76 assert(rw_lk.readers==0);
77 const typename atomic_t::atomic_state_type ret=rw_lk.readers_free.set();
78 assert(ret==lock_traits::atom_set);
81 assert(rw_lk.readers>=0);
90 assert(rw_lk.readers==0);
93 [[maybe_unused]]
const typename atomic_t::atomic_state_type ret=exclusive_w_lk.unlock();
94 assert(ret==lock_traits::atom_unset);
98 template<
class T>
inline
104 locker<T>::
lock()
noexcept(
false) {
107 assert(ret==lock_traits::atom_set);
126 template<
class T>
inline
130 assert(ret==lock_traits::atom_set);
133 template<
class T>
inline
135 assert(
dynamic_cast<atomic_t *>(&lk));
139 template<
class T>
inline
141 : exclusive_w_lk(l.writer_lk, lock_traits::infinite_timeout()), rw_lk(l) {
143 assert(ret==lock_traits::atom_set);
144 assert(rw_lk.readers==0);
147 template<
class T>
inline
149 assert(
dynamic_cast<atomic_t *>(&rw_lk));
151 assert(ret==lock_traits::atom_set);
154 template<
class T>
inline
160 template<
class T>
inline
165 template<
class T>
inline void
166 locker<T>::decaying_write_lock_type::
decay()
noexcept(
true) {