MeshProtocolSimulator  1.0.0
ThreadLock.h
Go to the documentation of this file.
1 
12 #ifndef HELPERS_THREADLOCK_INC_THREADLOCK_H_
13 #define HELPERS_THREADLOCK_INC_THREADLOCK_H_
14 
15 #ifndef SIMULATION
16 #include <wirish.h>
17 #endif // !SIMULATION
18 #include <functional>
19 
41 #define TLock(lockObj) for(std::function<void(void)> func = nullptr; func == nullptr; (lockObj).DoLocked(func)) func = [&]()
42 
65 #define TLockS(lockObj, ret) for(std::function<void(void)> func = nullptr; func == nullptr; (ret) = (lockObj).DoLocked(func)) func = [&]()
66 
85 #define TLWhenUnlockedS(lockObj, ret) for(__magic_lock_raii rrrrr___(&(lockObj), (ret)); !rrrrr___.lck; rrrrr___.lck = true)
86 
104 #define TLWhenUnlocked(lockObj) for(__magic_lock_raii rrrrr___(&(lockObj)); !rrrrr___.lck; rrrrr___.lck = true)
105 
106 #define THREAD_LOCK_FUNC_BUFF_SIZE (5) //Size of function buffer (max count of interrupts when locked)
107 
157 class ThreadLock{
158 public:
159  ThreadLock():
160  lock(false),
161  funcBufferCnt(0)
162  {
163 
164  }
208  bool DoLocked(std::function<void(void)> func);
209 
214  inline volatile bool isLocked(){
215  return lock;
216  }
217 
218  bool Lock();
219  bool Unlock();
220 
221 protected:
222  bool LockPriv();
223 
224  uint32_t UnlockPriv(uint32_t prim);
225 
226  volatile bool lock:1;
227  volatile uint8_t funcBufferCnt:5;
228  std::function<void(void)> funcBuffer [THREAD_LOCK_FUNC_BUFF_SIZE] = {nullptr};
229 };
230 
232 public:
233  __magic_lock_raii(ThreadLock *_lockObj, bool &lockStatus){
234  lockObj = _lockObj;
235  lck_stat = lockStatus = _lockObj->Lock();
236  lck = !lck_stat;
237  }
238 
239  __magic_lock_raii(ThreadLock *_lockObj){
240  lockObj = _lockObj;
241  lck_stat = _lockObj->Lock();
242  lck = !lck_stat;
243  }
244 
245  bool lck = false;
246 
247  ThreadLock* lockObj;
248 
250  if(lck_stat) lockObj->Unlock();
251  }
252 private:
253  bool lck_stat;
254 };
255 
256 #endif /* HELPERS_THREADLOCK_INC_THREADLOCK_H_ */
__magic_lock_raii
Definition: ThreadLock.h:231
ThreadLock
Class, that can be used for locking specific processes from being interrupted. Those interrupts funct...
isLocked
volatile bool isLocked()
Check if lock is locked.
Definition: ThreadLock.h:214