identt
Mutex.hpp
Go to the documentation of this file.
1 
33 #ifndef _IDENTT_HTTP_MUTEX_HPP_
34 #define _IDENTT_HTTP_MUTEX_HPP_
35 
36 #include <mutex>
37 
38 // Enable thread safety attributes only with clang.
39 #if defined(__clang__) && (!defined(SWIG))
40 #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
41 #else
42 #define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
43 #endif
44 
45 #define CAPABILITY(x) \
46  THREAD_ANNOTATION_ATTRIBUTE__(capability(x))
47 
48 #define SCOPED_CAPABILITY \
49  THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
50 
51 #define GUARDED_BY(x) \
52  THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
53 
54 #define PT_GUARDED_BY(x) \
55  THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
56 
57 #define ACQUIRED_BEFORE(...) \
58  THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))
59 
60 #define ACQUIRED_AFTER(...) \
61  THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))
62 
63 #define REQUIRES(...) \
64  THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__))
65 
66 #define REQUIRES_SHARED(...) \
67  THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__))
68 
69 #define ACQUIRE(...) \
70  THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__))
71 
72 #define ACQUIRE_SHARED(...) \
73  THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__))
74 
75 #define RELEASE(...) \
76  THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))
77 
78 #define RELEASE_SHARED(...) \
79  THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__))
80 
81 #define TRY_ACQUIRE(...) \
82  THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))
83 
84 #define TRY_ACQUIRE_SHARED(...) \
85  THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__))
86 
87 #define EXCLUDES(...) \
88  THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
89 
90 #define ASSERT_CAPABILITY(x) \
91  THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))
92 
93 #define ASSERT_SHARED_CAPABILITY(x) \
94  THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))
95 
96 #define RETURN_CAPABILITY(x) \
97  THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
98 
99 #define NO_THREAD_SAFETY_ANALYSIS \
100  THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
101 
102 namespace identt {
103 namespace http {
105 class CAPABILITY("mutex") Mutex {
106  std::mutex mutex;
107 
108 public:
109  void lock() ACQUIRE()
110  {
111  mutex.lock();
112  }
113 
114  void unlock() RELEASE()
115  {
116  mutex.unlock();
117  }
118 };
119 
121 class SCOPED_CAPABILITY LockGuard {
122  Mutex &mutex;
123  bool locked = true;
124 
125 public:
126  LockGuard(Mutex &mutex_) ACQUIRE(mutex_) : mutex(mutex_)
127  {
128  mutex.lock();
129  }
130  void unlock() RELEASE()
131  {
132  mutex.unlock();
133  locked = false;
134  }
135  ~LockGuard() RELEASE()
136  {
137  if(locked)
138  mutex.unlock();
139  }
140 };
141 
142 
143 } // namespace http
144 } // namespace identt
145 #endif // _IDENTT_HTTP_MUTEX_HPP_
Scoped mutex guard class that is annotated for Clang Thread Safety Analysis.
Definition: Mutex.hpp:121
Definition: CryptoBase.hpp:49