diff options
author | crupest <crupest@outlook.com> | 2021-06-08 20:22:21 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-06-08 20:22:21 +0800 |
commit | bb0bf92282a107e1e292ef7da84ad6468bed083c (patch) | |
tree | d27e7b1165bca4525244d7fb972e7604d0eee5ba /computer-network-experiment/ReadWriteLock.cpp | |
parent | ebf48992df78210131035c7e39664b69cb23b2ca (diff) | |
download | life-bb0bf92282a107e1e292ef7da84ad6468bed083c.tar.gz life-bb0bf92282a107e1e292ef7da84ad6468bed083c.tar.bz2 life-bb0bf92282a107e1e292ef7da84ad6468bed083c.zip |
...
Diffstat (limited to 'computer-network-experiment/ReadWriteLock.cpp')
-rw-r--r-- | computer-network-experiment/ReadWriteLock.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/computer-network-experiment/ReadWriteLock.cpp b/computer-network-experiment/ReadWriteLock.cpp new file mode 100644 index 0000000..d9b6e3e --- /dev/null +++ b/computer-network-experiment/ReadWriteLock.cpp @@ -0,0 +1,59 @@ +#include "ReadWriteLock.h"
+
+#include <cassert>
+#include <memory>
+
+namespace cru {
+ReadWriteLock::ReadWriteLock() {
+#ifdef WIN32
+ lock_ = std::make_unique<SRWLOCK>();
+ InitializeSRWLock(lock_.get());
+#else
+#endif
+}
+
+ReadWriteLock::ReadWriteLock(ReadWriteLock &&other)
+ : lock_(std::move(other.lock_)) {}
+
+ReadWriteLock &ReadWriteLock::operator=(ReadWriteLock &&other) {
+ if (this != &other) {
+ Destroy();
+ lock_ = std::move(other.lock_);
+ }
+ return *this;
+}
+
+ReadWriteLock::~ReadWriteLock() { Destroy(); }
+
+void ReadWriteLock::ReadLock() {
+ assert(lock_);
+ AcquireSRWLockShared(lock_.get());
+}
+
+void ReadWriteLock::WriteLock() {
+ assert(lock_);
+ AcquireSRWLockExclusive(lock_.get());
+}
+
+bool ReadWriteLock::ReadTryLock() {
+ assert(lock_);
+ return TryAcquireSRWLockShared(lock_.get()) != 0;
+}
+
+bool ReadWriteLock::WriteTryLock() {
+ assert(lock_);
+ return TryAcquireSRWLockExclusive(lock_.get()) != 0;
+}
+
+void ReadWriteLock::ReadUnlock() {
+ assert(lock_);
+ ReleaseSRWLockShared(lock_.get());
+}
+
+void ReadWriteLock::WriteUnlock() {
+ assert(lock_);
+ ReleaseSRWLockExclusive(lock_.get());
+}
+
+void ReadWriteLock::Destroy() {}
+} // namespace cru
\ No newline at end of file |