Samchon Framework for CPP  1.0.0
SharedWriteLock.hpp
1 #pragma once
2 
3 #include <atomic>
4 #include <samchon/library/RWMutex.hpp>
5 
6 namespace samchon
7 {
8 namespace library
9 {
44  {
45  private:
50 
54  std::atomic<size_t> *reference;
55 
59  std::atomic<bool> *locked;
60 
61  public:
62  /* -----------------------------------------------------------
63  CONSTRUCTORS
64  ----------------------------------------------------------- */
71  SharedWriteLock(RWMutex &rw_mutex, bool lock = true)
72  {
73  this->rw_mutex = &rw_mutex;
74  this->reference = new std::atomic<size_t>(0);
75  this->locked = new std::atomic<bool>(false);
76 
77  if (lock == true)
78  this->lock();
79  };
80 
85  {
86  obj.reference->operator++();
87 
88  this->rw_mutex = obj.rw_mutex;
89  this->reference = obj.reference;
90  this->locked = obj.locked;
91  };
92 
97  {
98  //MOVE
99  this->rw_mutex = obj.rw_mutex;
100  this->reference = obj.reference;
101  this->locked = obj.locked;
102 
103  //TRUNCATE
104  obj.rw_mutex = nullptr;
105  obj.reference = nullptr;
106  obj.locked = nullptr;
107  };
108 
113  {
114  if (reference == nullptr || reference->operator--() > 0)
115  return;
116 
117  if (locked->load() == true)
118  rw_mutex->writeUnlock();
119 
120  delete reference;
121  delete locked;
122  };
123 
124  /* -----------------------------------------------------------
125  LOCKERS
126  ----------------------------------------------------------- */
130  void lock()
131  {
132  if (locked->load() == true)
133  return;
134 
135  rw_mutex->writeLock();
136  locked->store(true);
137  };
138 
142  void unlock()
143  {
144  if (locked->load() == false)
145  return;
146 
147  rw_mutex->writeUnlock();
148  locked->store(false);
149  };
150 
154  //auto tryLock() -> bool;
155  };
156 };
157 };
Shared lock from a RWMutex.
SharedWriteLock(RWMutex &rw_mutex, bool lock=true)
Construct from RWMutex.
void writeLock()
Lock on writing.
Definition: RWMutex.hpp:117
RWMutex * rw_mutex
Managed RWMutex.
void unlock()
Unlock on writing.
~SharedWriteLock()
Default Destructor.
std::atomic< bool > * locked
Whether the mutex was locked by SharedWriteLock.
SharedWriteLock(SharedWriteLock &&obj)
Move Constructor.
void writeUnlock()
Unlock on writing.
Definition: RWMutex.hpp:130
std::atomic< size_t > * reference
Referencing count sharing same RWMutex.
SharedWriteLock(const SharedWriteLock &obj)
Copy Constructor.