|
9 | 9 | #ifndef _FLUTTERPI_SRC_UTIL_LOCK_OPS_H |
10 | 10 | #define _FLUTTERPI_SRC_UTIL_LOCK_OPS_H |
11 | 11 |
|
12 | | -#include <pthread.h> |
13 | 12 | #include <errno.h> |
14 | 13 |
|
15 | | -#include "macros.h" |
| 14 | +#include <pthread.h> |
| 15 | + |
16 | 16 | #include "asserts.h" |
| 17 | +#include "macros.h" |
17 | 18 |
|
18 | 19 | // Code based on the template from: https://clang.llvm.org/docs/ThreadSafetyAnalysis.html |
19 | 20 |
|
20 | 21 | // Enable thread safety attributes only with clang. |
21 | 22 | // The attributes can be safely erased when compiling with other compilers. |
22 | 23 | #if defined(__clang__) && (!defined(SWIG)) |
23 | | -#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) |
| 24 | + #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) |
24 | 25 | #else |
25 | | -#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op |
| 26 | + #define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op |
26 | 27 | #endif |
27 | 28 |
|
28 | | -#define CAPABILITY(x) \ |
29 | | - THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) |
| 29 | +#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) |
30 | 30 |
|
31 | | -#define SCOPED_CAPABILITY \ |
32 | | - THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) |
| 31 | +#define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) |
33 | 32 |
|
34 | | -#define GUARDED_BY(x) \ |
35 | | - THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) |
| 33 | +#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) |
36 | 34 |
|
37 | | -#define PT_GUARDED_BY(x) \ |
38 | | - THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) |
| 35 | +#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) |
39 | 36 |
|
40 | | -#define ACQUIRED_BEFORE(...) \ |
41 | | - THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) |
| 37 | +#define ACQUIRED_BEFORE(...) THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) |
42 | 38 |
|
43 | | -#define ACQUIRED_AFTER(...) \ |
44 | | - THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) |
| 39 | +#define ACQUIRED_AFTER(...) THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) |
45 | 40 |
|
46 | | -#define REQUIRES(...) \ |
47 | | - THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__)) |
| 41 | +#define REQUIRES(...) THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__)) |
48 | 42 |
|
49 | | -#define REQUIRES_SHARED(...) \ |
50 | | - THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__)) |
| 43 | +#define REQUIRES_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__)) |
51 | 44 |
|
52 | | -#define ACQUIRE(...) \ |
53 | | - THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__)) |
| 45 | +#define ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__)) |
54 | 46 |
|
55 | | -#define ACQUIRE_SHARED(...) \ |
56 | | - THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__)) |
| 47 | +#define ACQUIRE_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__)) |
57 | 48 |
|
58 | | -#define RELEASE(...) \ |
59 | | - THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__)) |
| 49 | +#define RELEASE(...) THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__)) |
60 | 50 |
|
61 | | -#define RELEASE_SHARED(...) \ |
62 | | - THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__)) |
| 51 | +#define RELEASE_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__)) |
63 | 52 |
|
64 | | -#define RELEASE_GENERIC(...) \ |
65 | | - THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(__VA_ARGS__)) |
| 53 | +#define RELEASE_GENERIC(...) THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(__VA_ARGS__)) |
66 | 54 |
|
67 | | -#define TRY_ACQUIRE(...) \ |
68 | | - THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__)) |
| 55 | +#define TRY_ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__)) |
69 | 56 |
|
70 | | -#define TRY_ACQUIRE_SHARED(...) \ |
71 | | - THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__)) |
| 57 | +#define TRY_ACQUIRE_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__)) |
72 | 58 |
|
73 | | -#define EXCLUDES(...) \ |
74 | | - THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) |
| 59 | +#define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) |
75 | 60 |
|
76 | | -#define ASSERT_CAPABILITY(x) \ |
77 | | - THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) |
| 61 | +#define ASSERT_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) |
78 | 62 |
|
79 | | -#define ASSERT_SHARED_CAPABILITY(x) \ |
80 | | - THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) |
81 | | - |
82 | | -#define RETURN_CAPABILITY(x) \ |
83 | | - THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) |
84 | | - |
85 | | -#define NO_THREAD_SAFETY_ANALYSIS \ |
86 | | - THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) |
| 63 | +#define ASSERT_SHARED_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) |
87 | 64 |
|
| 65 | +#define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) |
88 | 66 |
|
| 67 | +#define NO_THREAD_SAFETY_ANALYSIS THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) |
89 | 68 |
|
90 | 69 | const pthread_mutexattr_t *get_default_mutex_attrs(); |
91 | 70 |
|
@@ -124,12 +103,11 @@ static inline void mutex_unlock(mutex_t *mutex) RELEASE() { |
124 | 103 | ASSERT_ZERO_MSG(ok, "Error unlocking mutex."); |
125 | 104 | } |
126 | 105 |
|
127 | | - |
128 | 106 | typedef pthread_rwlock_t rwlock_t CAPABILITY("mutex"); |
129 | 107 |
|
130 | 108 | static inline void rwlock_init(rwlock_t *restrict lock) { |
131 | | - ASSERTED int ok = pthread_rwlock_init(lock, NULL); |
132 | | - ASSERT_ZERO_MSG(ok, "Error initializing rwlock."); |
| 109 | + ASSERTED int ok = pthread_rwlock_init(lock, NULL); |
| 110 | + ASSERT_ZERO_MSG(ok, "Error initializing rwlock."); |
133 | 111 | } |
134 | 112 |
|
135 | 113 | static inline void rwlock_lock_read(rwlock_t *rwlock) ACQUIRE_SHARED() { |
@@ -159,7 +137,6 @@ static inline void rwlock_unlock(rwlock_t *rwlock) RELEASE() { |
159 | 137 | ASSERT_ZERO_MSG(ok, "Error unlocking rwlock."); |
160 | 138 | } |
161 | 139 |
|
162 | | - |
163 | 140 | #define DECLARE_LOCK_OPS(obj_name) \ |
164 | 141 | UNUSED void obj_name##_lock(struct obj_name *obj); \ |
165 | 142 | UNUSED void obj_name##_unlock(struct obj_name *obj); |
|
0 commit comments