@@ -47,8 +47,7 @@ enum bson_memory_order {
47
47
#define MSVC_MEMORDER_SUFFIX (X )
48
48
#endif
49
49
50
- #if defined(USE_LEGACY_GCC_ATOMICS ) || \
51
- (!defined(__clang__ ) && __GNUC__ == 4 )
50
+ #if defined(USE_LEGACY_GCC_ATOMICS ) || (!defined(__clang__ ) && __GNUC__ == 4 )
52
51
#define BSON_USE_LEGACY_GCC_ATOMICS
53
52
#else
54
53
#undef BSON_USE_LEGACY_GCC_ATOMICS
@@ -74,7 +73,8 @@ enum bson_memory_order {
74
73
#define BSON_EMULATE_INT
75
74
#endif
76
75
77
- #define DEF_ATOMIC_OP (MSVC_Intrinsic , GNU_Intrinsic , GNU_Legacy_Intrinsic , Order , ...) \
76
+ #define DEF_ATOMIC_OP ( \
77
+ MSVC_Intrinsic , GNU_Intrinsic , GNU_Legacy_Intrinsic , Order , ...) \
78
78
do { \
79
79
switch (Order) { \
80
80
case bson_memory_order_acq_rel: \
@@ -127,47 +127,43 @@ enum bson_memory_order {
127
127
} while (0)
128
128
129
129
130
- #define DEF_ATOMIC_CMPEXCH_STRONG ( \
131
- VCSuffix1 , VCSuffix2 , GNU_MemOrder , Ptr , ExpectActualVar , NewValue ) \
132
- do { \
133
- BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \
134
- _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \
135
- Ptr, NewValue, ExpectActualVar);) \
136
- BSON_IF_GNU_LIKE ( \
137
- (void) __atomic_compare_exchange_n (Ptr, \
138
- &ExpectActualVar, \
139
- NewValue, \
140
- false, /* Not weak */ \
141
- GNU_MemOrder , \
142
- GNU_MemOrder );) \
143
- BSON_IF_GNU_LEGACY_ATOMICS ( \
144
- __typeof__ (ExpectActualVar ) _val ; \
145
- _val = __sync_val_compare_and_swap (Ptr , \
146
- ExpectActualVar , \
147
- NewValue ); \
148
- ExpectActualVar = _val ;) \
130
+ #define DEF_ATOMIC_CMPEXCH_STRONG ( \
131
+ VCSuffix1 , VCSuffix2 , GNU_MemOrder , Ptr , ExpectActualVar , NewValue ) \
132
+ do { \
133
+ BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \
134
+ _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \
135
+ Ptr, NewValue, ExpectActualVar);) \
136
+ BSON_IF_GNU_LIKE ( \
137
+ (void) __atomic_compare_exchange_n (Ptr, \
138
+ &ExpectActualVar, \
139
+ NewValue, \
140
+ false, /* Not weak */ \
141
+ GNU_MemOrder , \
142
+ GNU_MemOrder );) \
143
+ BSON_IF_GNU_LEGACY_ATOMICS ( \
144
+ __typeof__ (ExpectActualVar ) _val ; \
145
+ _val = __sync_val_compare_and_swap (Ptr , ExpectActualVar , NewValue ); \
146
+ ExpectActualVar = _val ;) \
149
147
} while (0 )
150
148
151
149
152
- #define DEF_ATOMIC_CMPEXCH_WEAK ( \
153
- VCSuffix1 , VCSuffix2 , GNU_MemOrder , Ptr , ExpectActualVar , NewValue ) \
154
- do { \
155
- BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \
156
- _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \
157
- Ptr, NewValue, ExpectActualVar);) \
158
- BSON_IF_GNU_LIKE ( \
159
- (void) __atomic_compare_exchange_n (Ptr, \
160
- &ExpectActualVar, \
161
- NewValue, \
162
- true, /* Yes weak */ \
163
- GNU_MemOrder , \
164
- GNU_MemOrder );) \
165
- BSON_IF_GNU_LEGACY_ATOMICS ( \
166
- __typeof__ (ExpectActualVar ) _val ; \
167
- _val = __sync_val_compare_and_swap (Ptr , \
168
- ExpectActualVar , \
169
- NewValue ); \
170
- ExpectActualVar = _val ;) \
150
+ #define DEF_ATOMIC_CMPEXCH_WEAK ( \
151
+ VCSuffix1 , VCSuffix2 , GNU_MemOrder , Ptr , ExpectActualVar , NewValue ) \
152
+ do { \
153
+ BSON_IF_MSVC (ExpectActualVar = BSON_CONCAT3 ( \
154
+ _InterlockedCompareExchange, VCSuffix1, VCSuffix2) ( \
155
+ Ptr, NewValue, ExpectActualVar);) \
156
+ BSON_IF_GNU_LIKE ( \
157
+ (void) __atomic_compare_exchange_n (Ptr, \
158
+ &ExpectActualVar, \
159
+ NewValue, \
160
+ true, /* Yes weak */ \
161
+ GNU_MemOrder , \
162
+ GNU_MemOrder );) \
163
+ BSON_IF_GNU_LEGACY_ATOMICS ( \
164
+ __typeof__ (ExpectActualVar ) _val ; \
165
+ _val = __sync_val_compare_and_swap (Ptr , ExpectActualVar , NewValue ); \
166
+ ExpectActualVar = _val ;) \
171
167
} while (0 )
172
168
173
169
@@ -217,7 +213,10 @@ enum bson_memory_order {
217
213
default : \
218
214
BSON_UNREACHABLE ("Invalid bson_memory_order value" ); \
219
215
}) \
220
- BSON_IF_GNU_LEGACY_ATOMICS ({ __sync_synchronize (); return * a ; }) \
216
+ BSON_IF_GNU_LEGACY_ATOMICS ({ \
217
+ __sync_synchronize (); \
218
+ return * a ; \
219
+ }) \
221
220
} \
222
221
\
223
222
static BSON_INLINE Type bson_atomic_ ##NamePart ##_exchange ( \
@@ -342,24 +341,34 @@ enum bson_memory_order {
342
341
#define DECL_ATOMIC_STDINT (Name , VCSuffix ) \
343
342
DECL_ATOMIC_INTEGRAL (Name, Name##_t, VCSuffix)
344
343
345
- #if defined(_MSC_VER ) || defined (BSON_USE_LEGACY_GCC_ATOMICS )
346
- /* MSVC expects precise types for their atomic intrinsics. */
347
- DECL_ATOMIC_INTEGRAL (int8 , char , 8 );
344
+ #if defined(_MSC_VER ) || defined(BSON_USE_LEGACY_GCC_ATOMICS )
345
+ /* MSVC and GCC require built-in types (not typedefs) for their atomic
346
+ * intrinsics. */
347
+ #if defined(_MSC_VER )
348
+ #define DECL_ATOMIC_INTEGRAL_INT8 char
349
+ #define DECL_ATOMIC_INTEGRAL_INT32 long
350
+ #define DECL_ATOMIC_INTEGRAL_INT long
351
+ #else
352
+ #define DECL_ATOMIC_INTEGRAL_INT8 signed char
353
+ #define DECL_ATOMIC_INTEGRAL_INT32 int
354
+ #define DECL_ATOMIC_INTEGRAL_INT int
355
+ #endif
356
+ DECL_ATOMIC_INTEGRAL (int8 , DECL_ATOMIC_INTEGRAL_INT8 , 8 )
348
357
DECL_ATOMIC_INTEGRAL (int16 , short , 16 )
349
- #if !defined (BSON_EMULATE_INT32 )
350
- DECL_ATOMIC_INTEGRAL (int32 , long , )
358
+ #if !defined(BSON_EMULATE_INT32 )
359
+ DECL_ATOMIC_INTEGRAL (int32 , DECL_ATOMIC_INTEGRAL_INT32 , )
351
360
#endif
352
- #if !defined (BSON_EMULATE_INT )
353
- DECL_ATOMIC_INTEGRAL (int , long , )
361
+ #if !defined (BSON_EMULATE_INT )
362
+ DECL_ATOMIC_INTEGRAL (int , DECL_ATOMIC_INTEGRAL_INT , )
354
363
#endif
355
364
#else
356
365
/* Other compilers that we support provide generic intrinsics */
357
366
DECL_ATOMIC_STDINT (int8 , 8 )
358
367
DECL_ATOMIC_STDINT (int16 , 16 )
359
- #if !defined (BSON_EMULATE_INT32 )
368
+ #if !defined (BSON_EMULATE_INT32 )
360
369
DECL_ATOMIC_STDINT (int32 , )
361
370
#endif
362
- #if !defined (BSON_EMULATE_INT )
371
+ #if !defined (BSON_EMULATE_INT )
363
372
DECL_ATOMIC_INTEGRAL (int , int , )
364
373
#endif
365
374
#endif
@@ -609,12 +618,8 @@ bson_atomic_ptr_exchange (void *volatile *ptr,
609
618
* ptr ,
610
619
new_value );
611
620
#else
612
- DEF_ATOMIC_OP (_InterlockedExchangePointer ,
613
- __atomic_exchange_n ,
614
- ,
615
- ord ,
616
- ptr ,
617
- new_value );
621
+ DEF_ATOMIC_OP (
622
+ _InterlockedExchangePointer , __atomic_exchange_n , , ord , ptr , new_value );
618
623
#endif
619
624
}
620
625
0 commit comments