1#ifndef LIBOSMSCOUT_READWRITELOCK_H
2#define LIBOSMSCOUT_READWRITELOCK_H
28#include <condition_variable>
41 mutable std::atomic<bool> s_spin =
false;
43 volatile int x_wait = 0;
44 volatile int x_flag = 0;
45 std::thread::id x_owner;
47 std::mutex x_gate_lock;
48 std::condition_variable x_gate;
49 std::mutex s_gate_lock;
50 std::condition_variable s_gate;
55 TNode * _prev =
nullptr;
56 TNode * _next =
nullptr;
60 TNode * s_freed =
nullptr;
61 TNode * s_nodes =
nullptr;
64 while (s_spin.exchange(
true, std::memory_order_acquire)) {
66 std::this_thread::yield();
67 }
while (s_spin.load(std::memory_order_relaxed));
71 s_spin.store(
false, std::memory_order_release);
74 TNode * find_node(
const std::thread::id&
id);
75 TNode * new_node(
const std::thread::id&
id);
76 void free_node(TNode * n);
80 explicit Latch(
bool _px) : px(_px) { }
122 std::swap(owns, rl.owns);
155 if (!owns && p !=
nullptr) {
169 if (!owns && p !=
nullptr) {
170 owns = p->try_lock_shared();
188 std::swap(owns, wl.owns);
218 if (!owns && p !=
nullptr) {
#define OSMSCOUT_API
Definition CoreImportExport.h:45
Definition ReadWriteLock.h:39
Latch(const Latch &)=delete
Latch & operator=(const Latch &)=delete
Latch & operator=(Latch &&)=delete
Latch(bool _px)
Definition ReadWriteLock.h:80
bool try_lock()
Definition ReadWriteLock.h:168
ReadLock & operator=(ReadLock &&rl) noexcept
Definition ReadWriteLock.h:145
ReadLock(ReadLock const &)=delete
~ReadLock()
Definition ReadWriteLock.h:134
ReadLock(Latch &latch)
Definition ReadWriteLock.h:129
bool owns_lock() const noexcept
Definition ReadWriteLock.h:150
ReadLock(Latch &latch, std::adopt_lock_t)
Definition ReadWriteLock.h:132
ReadLock & operator=(ReadLock const &)=delete
ReadLock(ReadLock &&rl) noexcept
Definition ReadWriteLock.h:143
void unlock()
Definition ReadWriteLock.h:161
void lock()
Definition ReadWriteLock.h:154
~WriteLock()
Definition ReadWriteLock.h:197
WriteLock & operator=(WriteLock &&wl) noexcept
Definition ReadWriteLock.h:208
WriteLock(WriteLock const &)=delete
WriteLock & operator=(WriteLock const &)=delete
void lock()
Definition ReadWriteLock.h:217
bool owns_lock() const noexcept
Definition ReadWriteLock.h:213
WriteLock(Latch &latch)
Definition ReadWriteLock.h:195
void unlock()
Definition ReadWriteLock.h:224
WriteLock(WriteLock &&wl) noexcept
Definition ReadWriteLock.h:206