Coverage Report

Created: 2025-07-04 06:49

/src/cpython-install/include/python3.15/cpython/pyatomic_gcc.h
Line
Count
Source (jump to first uncovered line)
1
// This is the implementation of Python atomic operations using GCC's built-in
2
// functions that match the C+11 memory model. This implementation is preferred
3
// for GCC compatible compilers, such as Clang. These functions are available
4
// in GCC 4.8+ without needing to compile with --std=c11 or --std=gnu11.
5
6
#ifndef Py_ATOMIC_GCC_H
7
#  error "this header file must not be included directly"
8
#endif
9
10
11
// --- _Py_atomic_add --------------------------------------------------------
12
13
static inline int
14
_Py_atomic_add_int(int *obj, int value)
15
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
16
17
static inline int8_t
18
_Py_atomic_add_int8(int8_t *obj, int8_t value)
19
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
20
21
static inline int16_t
22
_Py_atomic_add_int16(int16_t *obj, int16_t value)
23
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
24
25
static inline int32_t
26
_Py_atomic_add_int32(int32_t *obj, int32_t value)
27
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
28
29
static inline int64_t
30
_Py_atomic_add_int64(int64_t *obj, int64_t value)
31
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
32
33
static inline intptr_t
34
_Py_atomic_add_intptr(intptr_t *obj, intptr_t value)
35
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
36
37
static inline unsigned int
38
_Py_atomic_add_uint(unsigned int *obj, unsigned int value)
39
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
40
41
static inline uint8_t
42
_Py_atomic_add_uint8(uint8_t *obj, uint8_t value)
43
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
44
45
static inline uint16_t
46
_Py_atomic_add_uint16(uint16_t *obj, uint16_t value)
47
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
48
49
static inline uint32_t
50
_Py_atomic_add_uint32(uint32_t *obj, uint32_t value)
51
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
52
53
static inline uint64_t
54
_Py_atomic_add_uint64(uint64_t *obj, uint64_t value)
55
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
56
57
static inline uintptr_t
58
_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value)
59
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
60
61
static inline Py_ssize_t
62
_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value)
63
0
{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); }
64
65
66
// --- _Py_atomic_compare_exchange -------------------------------------------
67
68
static inline int
69
_Py_atomic_compare_exchange_int(int *obj, int *expected, int desired)
70
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
71
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
72
73
static inline int
74
_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t desired)
75
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
76
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
77
78
static inline int
79
_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t desired)
80
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
81
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
82
83
static inline int
84
_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t desired)
85
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
86
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
87
88
static inline int
89
_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t desired)
90
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
91
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
92
93
static inline int
94
_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t desired)
95
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
96
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
97
98
static inline int
99
_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int desired)
100
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
101
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
102
103
static inline int
104
_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t desired)
105
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
106
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
107
108
static inline int
109
_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t desired)
110
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
111
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
112
113
static inline int
114
_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t desired)
115
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
116
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
117
118
static inline int
119
_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t desired)
120
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
121
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
122
123
static inline int
124
_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t desired)
125
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
126
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
127
128
static inline int
129
_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t desired)
130
0
{ return __atomic_compare_exchange_n(obj, expected, desired, 0,
131
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
132
133
static inline int
134
_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *desired)
135
0
{ return __atomic_compare_exchange_n((void **)obj, (void **)expected, desired, 0,
136
0
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
137
138
139
// --- _Py_atomic_exchange ---------------------------------------------------
140
141
static inline int
142
_Py_atomic_exchange_int(int *obj, int value)
143
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
144
145
static inline int8_t
146
_Py_atomic_exchange_int8(int8_t *obj, int8_t value)
147
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
148
149
static inline int16_t
150
_Py_atomic_exchange_int16(int16_t *obj, int16_t value)
151
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
152
153
static inline int32_t
154
_Py_atomic_exchange_int32(int32_t *obj, int32_t value)
155
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
156
157
static inline int64_t
158
_Py_atomic_exchange_int64(int64_t *obj, int64_t value)
159
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
160
161
static inline intptr_t
162
_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value)
163
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
164
165
static inline unsigned int
166
_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value)
167
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
168
169
static inline uint8_t
170
_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value)
171
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
172
173
static inline uint16_t
174
_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value)
175
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
176
177
static inline uint32_t
178
_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value)
179
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
180
181
static inline uint64_t
182
_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value)
183
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
184
185
static inline uintptr_t
186
_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value)
187
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
188
189
static inline Py_ssize_t
190
_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value)
191
0
{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); }
192
193
static inline void *
194
_Py_atomic_exchange_ptr(void *obj, void *value)
195
0
{ return __atomic_exchange_n((void **)obj, value, __ATOMIC_SEQ_CST); }
196
197
198
// --- _Py_atomic_and --------------------------------------------------------
199
200
static inline uint8_t
201
_Py_atomic_and_uint8(uint8_t *obj, uint8_t value)
202
0
{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); }
203
204
static inline uint16_t
205
_Py_atomic_and_uint16(uint16_t *obj, uint16_t value)
206
0
{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); }
207
208
static inline uint32_t
209
_Py_atomic_and_uint32(uint32_t *obj, uint32_t value)
210
0
{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); }
211
212
static inline uint64_t
213
_Py_atomic_and_uint64(uint64_t *obj, uint64_t value)
214
0
{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); }
215
216
static inline uintptr_t
217
_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value)
218
0
{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); }
219
220
221
// --- _Py_atomic_or ---------------------------------------------------------
222
223
static inline uint8_t
224
_Py_atomic_or_uint8(uint8_t *obj, uint8_t value)
225
0
{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); }
226
227
static inline uint16_t
228
_Py_atomic_or_uint16(uint16_t *obj, uint16_t value)
229
0
{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); }
230
231
static inline uint32_t
232
_Py_atomic_or_uint32(uint32_t *obj, uint32_t value)
233
0
{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); }
234
235
static inline uint64_t
236
_Py_atomic_or_uint64(uint64_t *obj, uint64_t value)
237
0
{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); }
238
239
static inline uintptr_t
240
_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value)
241
0
{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); }
242
243
244
// --- _Py_atomic_load -------------------------------------------------------
245
246
static inline int
247
_Py_atomic_load_int(const int *obj)
248
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
249
250
static inline int8_t
251
_Py_atomic_load_int8(const int8_t *obj)
252
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
253
254
static inline int16_t
255
_Py_atomic_load_int16(const int16_t *obj)
256
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
257
258
static inline int32_t
259
_Py_atomic_load_int32(const int32_t *obj)
260
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
261
262
static inline int64_t
263
_Py_atomic_load_int64(const int64_t *obj)
264
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
265
266
static inline intptr_t
267
_Py_atomic_load_intptr(const intptr_t *obj)
268
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
269
270
static inline uint8_t
271
_Py_atomic_load_uint8(const uint8_t *obj)
272
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
273
274
static inline uint16_t
275
_Py_atomic_load_uint16(const uint16_t *obj)
276
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
277
278
static inline uint32_t
279
_Py_atomic_load_uint32(const uint32_t *obj)
280
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
281
282
static inline uint64_t
283
_Py_atomic_load_uint64(const uint64_t *obj)
284
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
285
286
static inline uintptr_t
287
_Py_atomic_load_uintptr(const uintptr_t *obj)
288
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
289
290
static inline unsigned int
291
_Py_atomic_load_uint(const unsigned int *obj)
292
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
293
294
static inline Py_ssize_t
295
_Py_atomic_load_ssize(const Py_ssize_t *obj)
296
0
{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); }
297
298
static inline void *
299
_Py_atomic_load_ptr(const void *obj)
300
0
{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_SEQ_CST); }
301
302
303
// --- _Py_atomic_load_relaxed -----------------------------------------------
304
305
static inline int
306
_Py_atomic_load_int_relaxed(const int *obj)
307
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
308
309
static inline char
310
_Py_atomic_load_char_relaxed(const char *obj)
311
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
312
313
static inline unsigned char
314
_Py_atomic_load_uchar_relaxed(const unsigned char *obj)
315
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
316
317
static inline short
318
_Py_atomic_load_short_relaxed(const short *obj)
319
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
320
321
static inline unsigned short
322
_Py_atomic_load_ushort_relaxed(const unsigned short *obj)
323
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
324
325
static inline long
326
_Py_atomic_load_long_relaxed(const long *obj)
327
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
328
329
static inline float
330
_Py_atomic_load_float_relaxed(const float *obj)
331
0
{ float ret; __atomic_load(obj, &ret, __ATOMIC_RELAXED); return ret; }
332
333
static inline double
334
_Py_atomic_load_double_relaxed(const double *obj)
335
0
{ double ret; __atomic_load(obj, &ret, __ATOMIC_RELAXED); return ret; }
336
337
static inline int8_t
338
_Py_atomic_load_int8_relaxed(const int8_t *obj)
339
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
340
341
static inline int16_t
342
_Py_atomic_load_int16_relaxed(const int16_t *obj)
343
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
344
345
static inline int32_t
346
_Py_atomic_load_int32_relaxed(const int32_t *obj)
347
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
348
349
static inline int64_t
350
_Py_atomic_load_int64_relaxed(const int64_t *obj)
351
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
352
353
static inline intptr_t
354
_Py_atomic_load_intptr_relaxed(const intptr_t *obj)
355
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
356
357
static inline uint8_t
358
_Py_atomic_load_uint8_relaxed(const uint8_t *obj)
359
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
360
361
static inline uint16_t
362
_Py_atomic_load_uint16_relaxed(const uint16_t *obj)
363
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
364
365
static inline uint32_t
366
_Py_atomic_load_uint32_relaxed(const uint32_t *obj)
367
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
368
369
static inline uint64_t
370
_Py_atomic_load_uint64_relaxed(const uint64_t *obj)
371
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
372
373
static inline uintptr_t
374
_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj)
375
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
376
377
static inline unsigned int
378
_Py_atomic_load_uint_relaxed(const unsigned int *obj)
379
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
380
381
static inline Py_ssize_t
382
_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj)
383
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
384
385
static inline void *
386
_Py_atomic_load_ptr_relaxed(const void *obj)
387
0
{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_RELAXED); }
388
389
static inline unsigned long long
390
_Py_atomic_load_ullong_relaxed(const unsigned long long *obj)
391
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
392
393
static inline long long
394
_Py_atomic_load_llong_relaxed(const long long *obj)
395
0
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
396
397
398
// --- _Py_atomic_store ------------------------------------------------------
399
400
static inline void
401
_Py_atomic_store_int(int *obj, int value)
402
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
403
404
static inline void
405
_Py_atomic_store_int8(int8_t *obj, int8_t value)
406
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
407
408
static inline void
409
_Py_atomic_store_int16(int16_t *obj, int16_t value)
410
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
411
412
static inline void
413
_Py_atomic_store_int32(int32_t *obj, int32_t value)
414
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
415
416
static inline void
417
_Py_atomic_store_int64(int64_t *obj, int64_t value)
418
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
419
420
static inline void
421
_Py_atomic_store_intptr(intptr_t *obj, intptr_t value)
422
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
423
424
static inline void
425
_Py_atomic_store_uint8(uint8_t *obj, uint8_t value)
426
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
427
428
static inline void
429
_Py_atomic_store_uint16(uint16_t *obj, uint16_t value)
430
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
431
432
static inline void
433
_Py_atomic_store_uint32(uint32_t *obj, uint32_t value)
434
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
435
436
static inline void
437
_Py_atomic_store_uint64(uint64_t *obj, uint64_t value)
438
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
439
440
static inline void
441
_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value)
442
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
443
444
static inline void
445
_Py_atomic_store_uint(unsigned int *obj, unsigned int value)
446
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
447
448
static inline void
449
_Py_atomic_store_ptr(void *obj, void *value)
450
0
{ __atomic_store_n((void **)obj, value, __ATOMIC_SEQ_CST); }
451
452
static inline void
453
_Py_atomic_store_ssize(Py_ssize_t *obj, Py_ssize_t value)
454
0
{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); }
455
456
457
// --- _Py_atomic_store_relaxed ----------------------------------------------
458
459
static inline void
460
_Py_atomic_store_int_relaxed(int *obj, int value)
461
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
462
463
static inline void
464
_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value)
465
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
466
467
static inline void
468
_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value)
469
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
470
471
static inline void
472
_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value)
473
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
474
475
static inline void
476
_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value)
477
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
478
479
static inline void
480
_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value)
481
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
482
483
static inline void
484
_Py_atomic_store_uint8_relaxed(uint8_t *obj, uint8_t value)
485
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
486
487
static inline void
488
_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value)
489
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
490
491
static inline void
492
_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value)
493
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
494
495
static inline void
496
_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value)
497
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
498
499
static inline void
500
_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value)
501
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
502
503
static inline void
504
_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value)
505
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
506
507
static inline void
508
_Py_atomic_store_ptr_relaxed(void *obj, void *value)
509
0
{ __atomic_store_n((void **)obj, value, __ATOMIC_RELAXED); }
510
511
static inline void
512
_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value)
513
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
514
515
static inline void
516
_Py_atomic_store_ullong_relaxed(unsigned long long *obj,
517
                                unsigned long long value)
518
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
519
520
static inline void
521
_Py_atomic_store_char_relaxed(char *obj, char value)
522
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
523
524
static inline void
525
_Py_atomic_store_uchar_relaxed(unsigned char *obj, unsigned char value)
526
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
527
528
static inline void
529
_Py_atomic_store_short_relaxed(short *obj, short value)
530
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
531
532
static inline void
533
_Py_atomic_store_ushort_relaxed(unsigned short *obj, unsigned short value)
534
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
535
536
static inline void
537
_Py_atomic_store_long_relaxed(long *obj, long value)
538
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
539
540
static inline void
541
_Py_atomic_store_float_relaxed(float *obj, float value)
542
0
{ __atomic_store(obj, &value, __ATOMIC_RELAXED); }
543
544
static inline void
545
_Py_atomic_store_double_relaxed(double *obj, double value)
546
0
{ __atomic_store(obj, &value, __ATOMIC_RELAXED); }
547
548
static inline void
549
_Py_atomic_store_llong_relaxed(long long *obj, long long value)
550
0
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
551
552
553
// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------
554
555
static inline void *
556
_Py_atomic_load_ptr_acquire(const void *obj)
557
0
{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_ACQUIRE); }
558
559
static inline uintptr_t
560
_Py_atomic_load_uintptr_acquire(const uintptr_t *obj)
561
0
{ return (uintptr_t)__atomic_load_n(obj, __ATOMIC_ACQUIRE); }
562
563
static inline void
564
_Py_atomic_store_ptr_release(void *obj, void *value)
565
0
{ __atomic_store_n((void **)obj, value, __ATOMIC_RELEASE); }
566
567
static inline void
568
_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value)
569
0
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
570
571
static inline void
572
_Py_atomic_store_int_release(int *obj, int value)
573
0
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
574
575
static inline void
576
_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
577
0
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
578
579
static inline int
580
_Py_atomic_load_int_acquire(const int *obj)
581
0
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
582
583
static inline void
584
_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value)
585
0
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
586
587
static inline void
588
_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value)
589
0
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
590
591
static inline uint64_t
592
_Py_atomic_load_uint64_acquire(const uint64_t *obj)
593
0
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
594
595
static inline uint32_t
596
_Py_atomic_load_uint32_acquire(const uint32_t *obj)
597
0
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
598
599
static inline Py_ssize_t
600
_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
601
0
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
602
603
// --- _Py_atomic_fence ------------------------------------------------------
604
605
static inline void
606
_Py_atomic_fence_seq_cst(void)
607
0
{ __atomic_thread_fence(__ATOMIC_SEQ_CST); }
608
609
 static inline void
610
_Py_atomic_fence_acquire(void)
611
0
{ __atomic_thread_fence(__ATOMIC_ACQUIRE); }
612
613
 static inline void
614
_Py_atomic_fence_release(void)
615
0
{ __atomic_thread_fence(__ATOMIC_RELEASE); }