libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
readwritelock.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <shared_mutex>
14#include <promeki/namespace.h>
15
16PROMEKI_NAMESPACE_BEGIN
17
31class ReadWriteLock {
32 public:
36 class ReadLocker {
37 public:
42 ReadLocker(ReadWriteLock &lock) : _lock(lock) { _lock.lockForRead(); }
43
45 ~ReadLocker() { _lock.unlock(); }
46
47 ReadLocker(const ReadLocker &) = delete;
48 ReadLocker &operator=(const ReadLocker &) = delete;
49 ReadLocker(ReadLocker &&) = delete;
50 ReadLocker &operator=(ReadLocker &&) = delete;
51
52 private:
53 ReadWriteLock &_lock;
54 };
55
59 class WriteLocker {
60 public:
65 WriteLocker(ReadWriteLock &lock) : _lock(lock) { _lock.lockForWrite(); }
66
68 ~WriteLocker() { _lock.unlock(); }
69
70 WriteLocker(const WriteLocker &) = delete;
71 WriteLocker &operator=(const WriteLocker &) = delete;
72 WriteLocker(WriteLocker &&) = delete;
73 WriteLocker &operator=(WriteLocker &&) = delete;
74
75 private:
76 ReadWriteLock &_lock;
77 };
78
80 ReadWriteLock() = default;
81
83 ~ReadWriteLock() = default;
84
85 ReadWriteLock(const ReadWriteLock &) = delete;
86 ReadWriteLock &operator=(const ReadWriteLock &) = delete;
87 ReadWriteLock(ReadWriteLock &&) = delete;
88 ReadWriteLock &operator=(ReadWriteLock &&) = delete;
89
91 void lockForRead() { _mutex.lock_shared(); }
92
94 void lockForWrite() { _mutex.lock(); }
95
97 void unlock() { _mutex.unlock(); }
98
103 bool tryLockForRead() { return _mutex.try_lock_shared(); }
104
109 bool tryLockForWrite() { return _mutex.try_lock(); }
110
111 private:
112 std::shared_mutex _mutex;
113};
114
115PROMEKI_NAMESPACE_END
116
117#endif // PROMEKI_ENABLE_CORE