Samchon Framework for CPP  1.0.0
SharedWriteLock.cpp
1 #include <samchon/library/SharedWriteLock.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 SharedWriteLock::SharedWriteLock(RWMutex &semaphore, bool doLock)
13 {
14  if(doLock == true)
15  semaphore.writeLock();
16 
17  this->semaphore = &semaphore;
18 
19  this->reference = new atomic<size_t>(1);
20  this->isLocked = new atomic<bool>(doLock);
21 }
22 SharedWriteLock::SharedWriteLock(const SharedWriteLock &obj)
23 {
24  obj.reference->operator++();
25 
26  this->semaphore = obj.semaphore;
27  this->reference = obj.reference;
28  this->isLocked = obj.isLocked;
29 }
30 SharedWriteLock::SharedWriteLock(SharedWriteLock &&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 SharedWriteLock::~SharedWriteLock()
44 {
45  if(reference == nullptr || reference->operator--() > 0)
46  return;
47 
48  if(isLocked->load() == true)
49  semaphore->writeUnlock();
50 
51  delete reference;
52  delete isLocked;
53 }
54 
55 /* -----------------------------------------------------------
56 LOCKERS
57 ----------------------------------------------------------- */
58 void SharedWriteLock::lock()
59 {
60  if(isLocked->load() == true)
61  return;
62 
63  semaphore->writeLock();
64  isLocked->store(true);
65 }
66 void SharedWriteLock::unlock()
67 {
68  if(isLocked->load() == false)
69  return;
70 
71  semaphore->writeUnlock();
72  isLocked->store(false);
73 }
Shared lock from a RWMutex.
Definition: RWMutex.hpp:4
Package of libraries.
Definition: library.hpp:84
std::atomic< bool > * isLocked
Whether the mutex was locked by SharedWriteLock.
void writeLock()
Lock on writing.
Definition: RWMutex.cpp:53
RWMutex * semaphore
Managed RWMutex.
std::atomic< size_t > * reference
Referencing count sharing same RWMutex.