13
13
*/
14
14
15
15
typedef enum {
16
- memory_order_relaxed ,
17
- memory_order_consume ,
18
- memory_order_acquire ,
19
- memory_order_release ,
20
- memory_order_acq_rel ,
21
- memory_order_seq_cst ,
16
+ memory_order_relaxed = __ATOMIC_RELAXED ,
17
+ memory_order_consume = __ATOMIC_CONSUME ,
18
+ memory_order_acquire = __ATOMIC_ACQUIRE ,
19
+ memory_order_release = __ATOMIC_RELEASE ,
20
+ memory_order_acq_rel = __ATOMIC_ACQ_REL ,
21
+ memory_order_seq_cst = __ATOMIC_SEQ_CST
22
22
} memory_order ;
23
23
24
- #define ATOMIC_VAR_INIT (...) __VA_ARGS__
24
+ #if !(defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L )
25
+ #define ATOMIC_VAR_INIT (...) __VA_ARGS__
26
+ #endif
27
+
25
28
#define atomic_is_lock_free (obj ) ((void)(obj), sizeof(obj) <= sizeof(void *))
26
29
27
30
#define atomic_flag atomic_bool
28
- #define ATOMIC_FLAG_INIT ATOMIC_VAR_INIT(0)
31
+ #define ATOMIC_FLAG_INIT false
29
32
#define atomic_flag_test_and_set_explicit (x , order ) \
30
33
atomic_exchange_explicit(x, 1, order)
31
34
#define atomic_flag_clear_explicit (x , order ) atomic_store_explicit(x, 0, order)
32
35
33
- #define atomic_compare_exchange_strong (pObject , pExpected , desired ) \
34
- atomic_compare_exchange_strong_explicit( \
35
- pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
36
- #define atomic_compare_exchange_weak (pObject , pExpected , desired ) \
37
- atomic_compare_exchange_weak_explicit( \
38
- pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
39
- #define atomic_exchange (pObject , desired ) \
40
- atomic_exchange_explicit(pObject, desired, memory_order_seq_cst)
41
- #define atomic_fetch_add (pObject , operand ) \
42
- atomic_fetch_add_explicit(pObject, operand, memory_order_seq_cst)
43
- #define atomic_fetch_and (pObject , operand ) \
44
- atomic_fetch_and_explicit(pObject, operand, memory_order_seq_cst)
45
- #define atomic_fetch_or (pObject , operand ) \
46
- atomic_fetch_or_explicit(pObject, operand, memory_order_seq_cst)
47
- #define atomic_fetch_sub (pObject , operand ) \
48
- atomic_fetch_sub_explicit(pObject, operand, memory_order_seq_cst)
49
- #define atomic_fetch_xor (pObject , operand ) \
50
- atomic_fetch_xor_explicit(pObject, operand, memory_order_seq_cst)
51
- #define atomic_load (pObject ) atomic_load_explicit(pObject, memory_order_seq_cst)
52
- #define atomic_store (pObject , desired ) \
53
- atomic_store_explicit(pObject, desired, memory_order_seq_cst)
54
- #define atomic_flag_test_and_set (x ) \
55
- atomic_flag_test_and_set_explicit(x, memory_order_seq_cst)
56
- #define atomic_flag_clear (x ) atomic_flag_clear_explicit(x, memory_order_seq_cst)
57
-
58
36
#if defined(__CLANG_ATOMIC_BOOL_LOCK_FREE )
59
37
60
38
#define atomic_init (obj , value ) __c11_atomic_init(obj, value)
@@ -84,9 +62,35 @@ typedef enum {
84
62
#define atomic_store_explicit (object , desired , order ) \
85
63
__c11_atomic_store(object, desired, order)
86
64
65
+ #define atomic_compare_exchange_strong (pObject , pExpected , desired ) \
66
+ atomic_compare_exchange_strong_explicit( \
67
+ pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
68
+ #define atomic_compare_exchange_weak (pObject , pExpected , desired ) \
69
+ atomic_compare_exchange_weak_explicit( \
70
+ pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
71
+ #define atomic_exchange (pObject , desired ) \
72
+ atomic_exchange_explicit(pObject, desired, memory_order_seq_cst)
73
+ #define atomic_fetch_add (pObject , operand ) \
74
+ atomic_fetch_add_explicit(pObject, operand, memory_order_seq_cst)
75
+ #define atomic_fetch_and (pObject , operand ) \
76
+ atomic_fetch_and_explicit(pObject, operand, memory_order_seq_cst)
77
+ #define atomic_fetch_or (pObject , operand ) \
78
+ atomic_fetch_or_explicit(pObject, operand, memory_order_seq_cst)
79
+ #define atomic_fetch_sub (pObject , operand ) \
80
+ atomic_fetch_sub_explicit(pObject, operand, memory_order_seq_cst)
81
+ #define atomic_fetch_xor (pObject , operand ) \
82
+ atomic_fetch_xor_explicit(pObject, operand, memory_order_seq_cst)
83
+ #define atomic_load (pObject ) atomic_load_explicit(pObject, memory_order_seq_cst)
84
+ #define atomic_store (pObject , desired ) \
85
+ atomic_store_explicit(pObject, desired, memory_order_seq_cst)
86
+ #define atomic_flag_test_and_set (x ) \
87
+ atomic_flag_test_and_set_explicit(x, memory_order_seq_cst)
88
+ #define atomic_flag_clear (x ) atomic_flag_clear_explicit(x, memory_order_seq_cst)
89
+
87
90
#elif (__GNUC__ + 0 ) * 100 + (__GNUC_MINOR__ + 0 ) >= 407
88
91
89
- #define atomic_init (obj , value ) ((void)(*(obj) = (value)))
92
+ #define atomic_init (obj , value ) \
93
+ atomic_store_explicit(obj, value, __ATOMIC_RELAXED)
90
94
#define atomic_thread_fence (order ) __atomic_thread_fence(order)
91
95
#define atomic_signal_fence (order ) __atomic_signal_fence(order)
92
96
#define atomic_compare_exchange_strong_explicit (pObject , pExpected , desired , \
@@ -111,6 +115,31 @@ typedef enum {
111
115
#define atomic_store_explicit (pObject , desired , order ) \
112
116
__atomic_store_n(pObject, desired, order)
113
117
118
+ #define atomic_compare_exchange_strong (pObject , pExpected , desired ) \
119
+ atomic_compare_exchange_strong_explicit(pObject, pExpected, desired, \
120
+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
121
+ #define atomic_compare_exchange_weak (pObject , pExpected , desired ) \
122
+ atomic_compare_exchange_weak_explicit(pObject, pExpected, desired, \
123
+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
124
+ #define atomic_exchange (pObject , desired ) \
125
+ atomic_exchange_explicit(pObject, desired, __ATOMIC_SEQ_CST)
126
+ #define atomic_fetch_add (pObject , operand ) \
127
+ atomic_fetch_add_explicit(pObject, operand, __ATOMIC_SEQ_CST)
128
+ #define atomic_fetch_and (pObject , operand ) \
129
+ atomic_fetch_and_explicit(pObject, operand, __ATOMIC_SEQ_CST)
130
+ #define atomic_fetch_or (pObject , operand ) \
131
+ atomic_fetch_or_explicit(pObject, operand, __ATOMIC_SEQ_CST)
132
+ #define atomic_fetch_sub (pObject , operand ) \
133
+ atomic_fetch_sub_explicit(pObject, operand, __ATOMIC_SEQ_CST)
134
+ #define atomic_fetch_xor (pObject , operand ) \
135
+ atomic_fetch_xor_explicit(pObject, operand, __ATOMIC_SEQ_CST)
136
+ #define atomic_load (pObject ) atomic_load_explicit(pObject, __ATOMIC_SEQ_CST)
137
+ #define atomic_store (pObject , desired ) \
138
+ atomic_store_explicit(pObject, desired, __ATOMIC_SEQ_CST)
139
+ #define atomic_flag_test_and_set (x ) \
140
+ atomic_flag_test_and_set_explicit(x, __ATOMIC_SEQ_CST)
141
+ #define atomic_flag_clear (x ) atomic_flag_clear_explicit(x, __ATOMIC_SEQ_CST)
142
+
114
143
#elif (__GNUC__ + 0 ) * 100 + (__GNUC_MINOR__ + 0 ) >= 401
115
144
116
145
#define atomic_init (obj , value ) ((void)(*(obj) = (value)))
@@ -210,6 +239,31 @@ typedef enum {
210
239
#define atomic_store_explicit (object , desired , order ) \
211
240
((void)atomic_exchange_explicit(object, desired, order))
212
241
242
+ #define atomic_compare_exchange_strong (pObject , pExpected , desired ) \
243
+ atomic_compare_exchange_strong_explicit( \
244
+ pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
245
+ #define atomic_compare_exchange_weak (pObject , pExpected , desired ) \
246
+ atomic_compare_exchange_weak_explicit( \
247
+ pObject, pExpected, desired, memory_order_seq_cst, memory_order_seq_cst)
248
+ #define atomic_exchange (pObject , desired ) \
249
+ atomic_exchange_explicit(pObject, desired, memory_order_seq_cst)
250
+ #define atomic_fetch_add (pObject , operand ) \
251
+ atomic_fetch_add_explicit(pObject, operand, memory_order_seq_cst)
252
+ #define atomic_fetch_and (pObject , operand ) \
253
+ atomic_fetch_and_explicit(pObject, operand, memory_order_seq_cst)
254
+ #define atomic_fetch_or (pObject , operand ) \
255
+ atomic_fetch_or_explicit(pObject, operand, memory_order_seq_cst)
256
+ #define atomic_fetch_sub (pObject , operand ) \
257
+ atomic_fetch_sub_explicit(pObject, operand, memory_order_seq_cst)
258
+ #define atomic_fetch_xor (pObject , operand ) \
259
+ atomic_fetch_xor_explicit(pObject, operand, memory_order_seq_cst)
260
+ #define atomic_load (pObject ) atomic_load_explicit(pObject, memory_order_seq_cst)
261
+ #define atomic_store (pObject , desired ) \
262
+ atomic_store_explicit(pObject, desired, memory_order_seq_cst)
263
+ #define atomic_flag_test_and_set (x ) \
264
+ atomic_flag_test_and_set_explicit(x, memory_order_seq_cst)
265
+ #define atomic_flag_clear (x ) atomic_flag_clear_explicit(x, memory_order_seq_cst)
266
+
213
267
#else /* non-gcc or old gcc w/o x86 */
214
268
#error "atomic operations not supported with this compiler and/or architecture"
215
269
#endif
0 commit comments