summaryrefslogtreecommitdiffstats
path: root/xmrstak/cpputil/read_write_lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'xmrstak/cpputil/read_write_lock.h')
-rw-r--r--xmrstak/cpputil/read_write_lock.h108
1 files changed, 59 insertions, 49 deletions
diff --git a/xmrstak/cpputil/read_write_lock.h b/xmrstak/cpputil/read_write_lock.h
index 41ebc69..9139dfd 100644
--- a/xmrstak/cpputil/read_write_lock.h
+++ b/xmrstak/cpputil/read_write_lock.h
@@ -21,66 +21,76 @@
* SOFTWARE.
*/
-#ifndef CPPUTIL_READ_WRITE_LOCK_H_
-#define CPPUTIL_READ_WRITE_LOCK_H_
+#pragma once
#include <mutex>
#include <condition_variable>
-namespace cpputil {
+namespace cpputil
+{
-class RWLock {
+class RWLock
+{
public:
- RWLock() : status_(0), waiting_readers_(0), waiting_writers_(0) {}
- RWLock(const RWLock&) = delete;
- RWLock(RWLock&&) = delete;
- RWLock& operator = (const RWLock&) = delete;
- RWLock& operator = (RWLock&&) = delete;
+ RWLock() : status_(0), waiting_readers_(0), waiting_writers_(0) {}
+ RWLock(const RWLock&) = delete;
+ RWLock(RWLock&&) = delete;
+ RWLock& operator = (const RWLock&) = delete;
+ RWLock& operator = (RWLock&&) = delete;
- void ReadLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- waiting_readers_ += 1;
- read_cv_.wait(lck, [&]() { return waiting_writers_ == 0 && status_ >= 0; });
- waiting_readers_ -= 1;
- status_ += 1;
- }
+ void ReadLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ waiting_readers_ += 1;
+ read_cv_.wait(lck, [&]() { return waiting_writers_ == 0 && status_ >= 0; });
+ waiting_readers_ -= 1;
+ status_ += 1;
+ }
- void WriteLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- waiting_writers_ += 1;
- write_cv_.wait(lck, [&]() { return status_ == 0; });
- waiting_writers_ -= 1;
- status_ = -1;
- }
+ void WriteLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ waiting_writers_ += 1;
+ write_cv_.wait(lck, [&]() { return status_ == 0; });
+ waiting_writers_ -= 1;
+ status_ = -1;
+ }
- void UnLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- if (status_ == -1) {
- status_ = 0;
- } else {
- status_ -= 1;
- }
- if (waiting_writers_ > 0) {
- if (status_ == 0) {
- write_cv_.notify_one();
- }
- } else {
- read_cv_.notify_all();
- }
- }
+ void UnLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ if (status_ == -1) {
+ status_ = 0;
+ }
+ else
+ {
+ status_ -= 1;
+ }
+ if (waiting_writers_ > 0)
+ {
+ if (status_ == 0)
+ {
+ write_cv_.notify_one();
+ }
+ }
+ else
+ {
+ read_cv_.notify_all();
+ }
+ }
private:
- // -1 : one writer
- // 0 : no reader and no writer
- // n > 0 : n reader
- int32_t status_;
- int32_t waiting_readers_;
- int32_t waiting_writers_;
- std::mutex mtx_;
- std::condition_variable read_cv_;
- std::condition_variable write_cv_;
+ /** status of the lock
+ * -1 : one writer
+ * 0 : no reader and no writer
+ * n > 0 : n reader
+ */
+ int32_t status_;
+ int32_t waiting_readers_;
+ int32_t waiting_writers_;
+ std::mutex mtx_;
+ std::condition_variable read_cv_;
+ std::condition_variable write_cv_;
};
} // namespace cpputil
-
-#endif // CPPUTIL_READ_WRITE_LOCK_H_
OpenPOWER on IntegriCloud