aboutsummaryrefslogtreecommitdiff
path: root/works/life
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-06-08 20:37:49 +0800
committercrupest <crupest@outlook.com>2021-06-08 20:37:49 +0800
commit266d3e262d46225ec08bd5034c26631200442f45 (patch)
tree09f1dd515d8440b1bf7cbb732a7a26c81a93cab3 /works/life
parenta84887356487a4fcbd57a90f3ce17914ea8bdd0a (diff)
downloadcrupest-266d3e262d46225ec08bd5034c26631200442f45.tar.gz
crupest-266d3e262d46225ec08bd5034c26631200442f45.tar.bz2
crupest-266d3e262d46225ec08bd5034c26631200442f45.zip
import(life): ...
Diffstat (limited to 'works/life')
-rw-r--r--works/life/computer-network-experiment/ReadWriteLock.cpp41
-rw-r--r--works/life/computer-network-experiment/ReadWriteLock.h5
2 files changed, 45 insertions, 1 deletions
diff --git a/works/life/computer-network-experiment/ReadWriteLock.cpp b/works/life/computer-network-experiment/ReadWriteLock.cpp
index d9b6e3e..3509e0b 100644
--- a/works/life/computer-network-experiment/ReadWriteLock.cpp
+++ b/works/life/computer-network-experiment/ReadWriteLock.cpp
@@ -2,6 +2,7 @@
#include <cassert>
#include <memory>
+#include <pthread.h>
namespace cru {
ReadWriteLock::ReadWriteLock() {
@@ -9,6 +10,8 @@ ReadWriteLock::ReadWriteLock() {
lock_ = std::make_unique<SRWLOCK>();
InitializeSRWLock(lock_.get());
#else
+ lock_.reset(new pthread_rwlock_t(PTHREAD_RWLOCK_INITIALIZER));
+ pthread_rwlock_init(lock_.get(), nullptr);
#endif
}
@@ -27,33 +30,69 @@ ReadWriteLock::~ReadWriteLock() { Destroy(); }
void ReadWriteLock::ReadLock() {
assert(lock_);
+#ifdef WIN32
AcquireSRWLockShared(lock_.get());
+#else
+ pthread_rwlock_rdlock(lock_.get());
+#endif
}
void ReadWriteLock::WriteLock() {
assert(lock_);
+#ifdef WIN32
AcquireSRWLockExclusive(lock_.get());
+#else
+ pthread_rwlock_wrlock(lock_.get());
+#endif
}
bool ReadWriteLock::ReadTryLock() {
assert(lock_);
+#ifdef WIN32
return TryAcquireSRWLockShared(lock_.get()) != 0;
+#else
+ return pthread_rwlock_tryrdlock(lock_.get()) == 0;
+#endif
}
bool ReadWriteLock::WriteTryLock() {
assert(lock_);
+#ifdef WIN32
return TryAcquireSRWLockExclusive(lock_.get()) != 0;
+#else
+ return pthread_rwlock_trywrlock(lock_.get()) == 0;
+#endif
}
void ReadWriteLock::ReadUnlock() {
assert(lock_);
+#ifdef WIN32
ReleaseSRWLockShared(lock_.get());
+#else
+ pthread_rwlock_unlock(lock_.get());
+#endif
}
void ReadWriteLock::WriteUnlock() {
assert(lock_);
+#ifdef WIN32
ReleaseSRWLockExclusive(lock_.get());
+#else
+ pthread_rwlock_unlock(lock_.get());
+#endif
+}
+
+void ReadWriteLock::Destroy() {
+#ifndef WIN32
+ if (lock_ != nullptr)
+ pthread_rwlock_destroy(lock_.get());
+#endif
+}
+
+void swap(ReadWriteLock &left, ReadWriteLock &right) {
+ auto temp = std::move(left.lock_);
+ left.lock_ = std::move(right.lock_);
+ right.lock_ = std::move(temp);
}
-void ReadWriteLock::Destroy() {}
} // namespace cru \ No newline at end of file
diff --git a/works/life/computer-network-experiment/ReadWriteLock.h b/works/life/computer-network-experiment/ReadWriteLock.h
index c9889da..ee40ac0 100644
--- a/works/life/computer-network-experiment/ReadWriteLock.h
+++ b/works/life/computer-network-experiment/ReadWriteLock.h
@@ -6,10 +6,12 @@
#ifdef WIN32
#include <Windows.h>
#else
+#include <pthread.h>
#endif
namespace cru {
class ReadWriteLock {
+ friend void swap(ReadWriteLock &left, ReadWriteLock &right);
public:
ReadWriteLock();
@@ -35,6 +37,9 @@ private:
#ifdef WIN32
std::unique_ptr<SRWLOCK> lock_;
#else
+ std::unique_ptr<pthread_rwlock_t> lock_;
#endif
};
+
+void swap(ReadWriteLock &left, ReadWriteLock &right);
} // namespace cru