Samchon Framework for CPP  1.0.0
SharedReadLock.cpp
1 #include <samchon/library/SharedReadLock.hpp>
2 
3 #include <atomic>
4 #include <samchon/library/RWMutex.hpp>
5 
6 using namespace std;
7 using namespace samchon::library;
8 
9 /* -----------------------------------------------------------
10  CONSTRUCTORS
11 ----------------------------------------------------------- */
12 SharedReadLock::SharedReadLock(const RWMutex &semaphore, bool doLock)
13 {
14  if(doLock == true)
15  semaphore.readLock();
16 
17  this->semaphore = &semaphore;
18 
19  this->reference = new atomic<size_t>(1);
20  this->isLocked = new atomic<bool>(doLock);
21 }
22 SharedReadLock::SharedReadLock(const SharedReadLock &obj)
23 {
24  obj.reference->operator++();
25 
26  this->semaphore = obj.semaphore;
27  this->reference = obj.reference;
28  this->isLocked = obj.isLocked;
29 }
30 SharedReadLock::SharedReadLock(SharedReadLock &&obj)
31 {
32  //MOVE
33  this->semaphore = obj.semaphore;
34  this->reference = obj.reference;
35  this->isLocked = obj.isLocked;
36 
37  //TRUNCATE
38  obj.semaphore = nullptr;
39  obj.reference = nullptr;
40  obj.isLocked = nullptr;
41 }
42 
43 SharedReadLock::~SharedReadLock()
44 {
45  if(reference == nullptr || reference->operator--() > 0)
46  return;
47 
48  if(isLocked->load() == true)
49  semaphore->readUnlock();
50 
51  delete reference;
52  delete isLocked;
53 }
54 
55 /* -----------------------------------------------------------
56  LOCKERS
57 ----------------------------------------------------------- */
58 void SharedReadLock::lock() const
59 {
60  if(isLocked->load() == true)
61  return;
62 
63  semaphore->readLock();
64  isLocked->store(true);
65 }
66 void SharedReadLock::unlock() const
67 {
68  if(isLocked->load() == false)
69  return;
70 
71  semaphore->readUnlock();
72  isLocked->store(false);
73 }
Shared lock from a RWMutex.
const RWMutex * semaphore
Managed RWMutex.
std::atomic< size_t > * reference
Referencing count sharing same RWMutex.
Definition: RWMutex.hpp:4
Package of libraries.
Definition: library.hpp:84
std::atomic< bool > * isLocked
Whether the mutex was locked by SharedReadLock.
void readLock() const
Lock on read.
Definition: RWMutex.cpp:31