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