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 +++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'works/life/computer-network-experiment/ReadWriteLock.cpp') 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 -- cgit v1.2.3