Dynalib Utils
Synchronize.h
Go to the documentation of this file.
1 #include <atomic>
2 #include <thread>
3 #include <mutex>
4 
5 using namespace std;
6 
7 
12 #define synchronized(M) for(Lock M##_lock = M; M##_lock; M##_lock.setUnlock())
13 
14 
19 #define synch(M) { Lock M##_lock = M; for (; M##_lock; M##_lock.setUnlock())
20 #define synch_end }
21 
22 
24 private:
25  int _lockCnt;
26  atomic<thread::id> _owner;
27  mutex _mtx;
28 
29 public:
30  void acquire();
31  void release();
32 
33 };
34 
35 class Mutex {
36 private:
37  RecursiveLock* _recursiveLock;
38 
39 public:
40  //the default constructor
41  Mutex();
42  ~Mutex();
43  void lock();
44  void unlock();
45 };
46 
47 class Lock {
48 private:
49  Mutex& _mutex;
50  bool _locked;
51 
52 public:
53  Lock(Mutex &mutex);
54  ~Lock();
55  operator bool () const;
56  void setUnlock();
57 };
58 
59 template <typename F>
60 struct FinalAction {
61  FinalAction(F f) : _clean(f), _enabled(true) {}
62  ~FinalAction() { if (_enabled) _clean(); }
63  void disable() { _enabled = false; };
64 private:
65  F _clean;
66  bool _enabled;
67 };
68 
69 template <typename F>
71  return FinalAction<F>(f);
72 }
73 
74 #define finally() auto _final_obj=_finally([&]
75 #define finally1(M) auto M##_final_obj=_finally([M]
76 #define finally2(M,M2) auto M##_final_obj=_finally([M,M2]
77 #define finally3(M,M2,M3) auto M##_final_obj=_finally([M,M2,M3]
78 #define finally4(M,M2,M3,M4) auto M##_final_obj=_finally([M,M2,M3,M4]
79 #define finally5(M,M2,M3,M4,M5) auto M##_final_obj=_finally([M,M2,M3,M4,M5]
80 #define end_finally );
Definition: Synchronize.h:47
Definition: Synchronize.h:35
Definition: Synchronize.h:60
Definition: Synchronize.h:23
FinalAction(F f)
Definition: Synchronize.h:61
FinalAction< F > _finally(F f)
Definition: Synchronize.h:70
void disable()
Definition: Synchronize.h:63
~FinalAction()
Definition: Synchronize.h:62