From a84887356487a4fcbd57a90f3ce17914ea8bdd0a Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 8 Jun 2021 20:22:21 +0800 Subject: import(life): ... --- .../computer-network-experiment/ReadWriteLock.h | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 works/life/computer-network-experiment/ReadWriteLock.h (limited to 'works/life/computer-network-experiment/ReadWriteLock.h') diff --git a/works/life/computer-network-experiment/ReadWriteLock.h b/works/life/computer-network-experiment/ReadWriteLock.h new file mode 100644 index 0000000..c9889da --- /dev/null +++ b/works/life/computer-network-experiment/ReadWriteLock.h @@ -0,0 +1,40 @@ +#pragma once +#include "Common.h" + +#include + +#ifdef WIN32 +#include +#else +#endif + +namespace cru { +class ReadWriteLock { +public: + ReadWriteLock(); + + ReadWriteLock(ReadWriteLock &&other); + ReadWriteLock &operator=(ReadWriteLock &&other); + + ~ReadWriteLock(); + +public: + void ReadLock(); + void WriteLock(); + + bool ReadTryLock(); + bool WriteTryLock(); + + void ReadUnlock(); + void WriteUnlock(); + +private: + void Destroy(); + +private: +#ifdef WIN32 + std::unique_ptr lock_; +#else +#endif +}; +} // namespace cru -- cgit v1.2.3 From 266d3e262d46225ec08bd5034c26631200442f45 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 8 Jun 2021 20:37:49 +0800 Subject: import(life): ... --- .../computer-network-experiment/ReadWriteLock.cpp | 41 +++++++++++++++++++++- .../computer-network-experiment/ReadWriteLock.h | 5 +++ 2 files changed, 45 insertions(+), 1 deletion(-) (limited to 'works/life/computer-network-experiment/ReadWriteLock.h') 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 #include +#include namespace cru { ReadWriteLock::ReadWriteLock() { @@ -9,6 +10,8 @@ ReadWriteLock::ReadWriteLock() { lock_ = std::make_unique(); 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 #else +#include #endif namespace cru { class ReadWriteLock { + friend void swap(ReadWriteLock &left, ReadWriteLock &right); public: ReadWriteLock(); @@ -35,6 +37,9 @@ private: #ifdef WIN32 std::unique_ptr lock_; #else + std::unique_ptr lock_; #endif }; + +void swap(ReadWriteLock &left, ReadWriteLock &right); } // namespace cru -- cgit v1.2.3