diff options
Diffstat (limited to 'works/life/computer-network-experiment')
| -rw-r--r-- | works/life/computer-network-experiment/ReadWriteLock.cpp | 41 | ||||
| -rw-r--r-- | works/life/computer-network-experiment/ReadWriteLock.h | 5 | 
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
  | 
