• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This header file provides wrappers around the atomic operations found in
2 // `pyatomic.h` that are only atomic in free-threaded builds.
3 //
4 // These are intended to be used in places where atomics are required in
5 // free-threaded builds, but not in the default build, and we don't want to
6 // introduce the potential performance overhead of an atomic operation in the
7 // default build.
8 //
9 // All usages of these macros should be replaced with unconditionally atomic or
10 // non-atomic versions, and this file should be removed, once the dust settles
11 // on free threading.
12 #ifndef Py_ATOMIC_FT_WRAPPERS_H
13 #define Py_ATOMIC_FT_WRAPPERS_H
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #ifndef Py_BUILD_CORE
19 #error "this header requires Py_BUILD_CORE define"
20 #endif
21 
22 #ifdef Py_GIL_DISABLED
23 #define FT_ATOMIC_LOAD_PTR(value) _Py_atomic_load_ptr(&value)
24 #define FT_ATOMIC_STORE_PTR(value, new_value) _Py_atomic_store_ptr(&value, new_value)
25 #define FT_ATOMIC_LOAD_SSIZE(value) _Py_atomic_load_ssize(&value)
26 #define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) \
27     _Py_atomic_load_ssize_acquire(&value)
28 #define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) \
29     _Py_atomic_load_ssize_relaxed(&value)
30 #define FT_ATOMIC_STORE_PTR(value, new_value) \
31     _Py_atomic_store_ptr(&value, new_value)
32 #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) \
33     _Py_atomic_load_ptr_acquire(&value)
34 #define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) \
35     _Py_atomic_load_uintptr_acquire(&value)
36 #define FT_ATOMIC_LOAD_PTR_RELAXED(value) \
37     _Py_atomic_load_ptr_relaxed(&value)
38 #define FT_ATOMIC_LOAD_UINT8(value) \
39     _Py_atomic_load_uint8(&value)
40 #define FT_ATOMIC_STORE_UINT8(value, new_value) \
41     _Py_atomic_store_uint8(&value, new_value)
42 #define FT_ATOMIC_LOAD_UINT8_RELAXED(value) \
43     _Py_atomic_load_uint8_relaxed(&value)
44 #define FT_ATOMIC_LOAD_UINT16_RELAXED(value) \
45     _Py_atomic_load_uint16_relaxed(&value)
46 #define FT_ATOMIC_LOAD_UINT32_RELAXED(value) \
47     _Py_atomic_load_uint32_relaxed(&value)
48 #define FT_ATOMIC_LOAD_ULONG_RELAXED(value) \
49     _Py_atomic_load_ulong_relaxed(&value)
50 #define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) \
51     _Py_atomic_store_ptr_relaxed(&value, new_value)
52 #define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) \
53     _Py_atomic_store_ptr_release(&value, new_value)
54 #define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) \
55     _Py_atomic_store_uintptr_release(&value, new_value)
56 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) \
57     _Py_atomic_store_ssize_relaxed(&value, new_value)
58 #define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) \
59     _Py_atomic_store_uint8_relaxed(&value, new_value)
60 #define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) \
61     _Py_atomic_store_uint16_relaxed(&value, new_value)
62 #define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) \
63     _Py_atomic_store_uint32_relaxed(&value, new_value)
64 
65 #else
66 #define FT_ATOMIC_LOAD_PTR(value) value
67 #define FT_ATOMIC_STORE_PTR(value, new_value) value = new_value
68 #define FT_ATOMIC_LOAD_SSIZE(value) value
69 #define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) value
70 #define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) value
71 #define FT_ATOMIC_STORE_PTR(value, new_value) value = new_value
72 #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) value
73 #define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) value
74 #define FT_ATOMIC_LOAD_PTR_RELAXED(value) value
75 #define FT_ATOMIC_LOAD_UINT8(value) value
76 #define FT_ATOMIC_STORE_UINT8(value, new_value) value = new_value
77 #define FT_ATOMIC_LOAD_UINT8_RELAXED(value) value
78 #define FT_ATOMIC_LOAD_UINT16_RELAXED(value) value
79 #define FT_ATOMIC_LOAD_UINT32_RELAXED(value) value
80 #define FT_ATOMIC_LOAD_ULONG_RELAXED(value) value
81 #define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) value = new_value
82 #define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) value = new_value
83 #define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) value = new_value
84 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) value = new_value
85 #define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) value = new_value
86 #define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) value = new_value
87 #define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) value = new_value
88 
89 #endif
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 #endif /* !Py_ATOMIC_FT_WRAPPERS_H */
95