Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-19 09:50:49

0001 // This header file provides wrappers around the atomic operations found in
0002 // `pyatomic.h` that are only atomic in free-threaded builds.
0003 //
0004 // These are intended to be used in places where atomics are required in
0005 // free-threaded builds, but not in the default build, and we don't want to
0006 // introduce the potential performance overhead of an atomic operation in the
0007 // default build.
0008 //
0009 // All usages of these macros should be replaced with unconditionally atomic or
0010 // non-atomic versions, and this file should be removed, once the dust settles
0011 // on free threading.
0012 #ifndef Py_ATOMIC_FT_WRAPPERS_H
0013 #define Py_ATOMIC_FT_WRAPPERS_H
0014 #ifdef __cplusplus
0015 extern "C" {
0016 #endif
0017 
0018 #ifndef Py_BUILD_CORE
0019 #error "this header requires Py_BUILD_CORE define"
0020 #endif
0021 
0022 #ifdef Py_GIL_DISABLED
0023 #define FT_ATOMIC_LOAD_PTR(value) _Py_atomic_load_ptr(&value)
0024 #define FT_ATOMIC_STORE_PTR(value, new_value) _Py_atomic_store_ptr(&value, new_value)
0025 #define FT_ATOMIC_LOAD_SSIZE(value) _Py_atomic_load_ssize(&value)
0026 #define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) \
0027     _Py_atomic_load_ssize_acquire(&value)
0028 #define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) \
0029     _Py_atomic_load_ssize_relaxed(&value)
0030 #define FT_ATOMIC_STORE_PTR(value, new_value) \
0031     _Py_atomic_store_ptr(&value, new_value)
0032 #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) \
0033     _Py_atomic_load_ptr_acquire(&value)
0034 #define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) \
0035     _Py_atomic_load_uintptr_acquire(&value)
0036 #define FT_ATOMIC_LOAD_PTR_RELAXED(value) \
0037     _Py_atomic_load_ptr_relaxed(&value)
0038 #define FT_ATOMIC_LOAD_UINT8(value) \
0039     _Py_atomic_load_uint8(&value)
0040 #define FT_ATOMIC_STORE_UINT8(value, new_value) \
0041     _Py_atomic_store_uint8(&value, new_value)
0042 #define FT_ATOMIC_LOAD_UINT8_RELAXED(value) \
0043     _Py_atomic_load_uint8_relaxed(&value)
0044 #define FT_ATOMIC_LOAD_UINT16_RELAXED(value) \
0045     _Py_atomic_load_uint16_relaxed(&value)
0046 #define FT_ATOMIC_LOAD_UINT32_RELAXED(value) \
0047     _Py_atomic_load_uint32_relaxed(&value)
0048 #define FT_ATOMIC_LOAD_ULONG_RELAXED(value) \
0049     _Py_atomic_load_ulong_relaxed(&value)
0050 #define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) \
0051     _Py_atomic_store_ptr_relaxed(&value, new_value)
0052 #define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) \
0053     _Py_atomic_store_ptr_release(&value, new_value)
0054 #define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) \
0055     _Py_atomic_store_uintptr_release(&value, new_value)
0056 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) \
0057     _Py_atomic_store_ssize_relaxed(&value, new_value)
0058 #define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) \
0059     _Py_atomic_store_uint8_relaxed(&value, new_value)
0060 #define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) \
0061     _Py_atomic_store_uint16_relaxed(&value, new_value)
0062 #define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) \
0063     _Py_atomic_store_uint32_relaxed(&value, new_value)
0064 #define FT_ATOMIC_STORE_CHAR_RELAXED(value, new_value) \
0065     _Py_atomic_store_char_relaxed(&value, new_value)
0066 #define FT_ATOMIC_LOAD_CHAR_RELAXED(value) \
0067     _Py_atomic_load_char_relaxed(&value)
0068 #define FT_ATOMIC_STORE_UCHAR_RELAXED(value, new_value) \
0069     _Py_atomic_store_uchar_relaxed(&value, new_value)
0070 #define FT_ATOMIC_LOAD_UCHAR_RELAXED(value) \
0071     _Py_atomic_load_uchar_relaxed(&value)
0072 #define FT_ATOMIC_STORE_SHORT_RELAXED(value, new_value) \
0073     _Py_atomic_store_short_relaxed(&value, new_value)
0074 #define FT_ATOMIC_LOAD_SHORT_RELAXED(value) \
0075     _Py_atomic_load_short_relaxed(&value)
0076 #define FT_ATOMIC_STORE_USHORT_RELAXED(value, new_value) \
0077     _Py_atomic_store_ushort_relaxed(&value, new_value)
0078 #define FT_ATOMIC_LOAD_USHORT_RELAXED(value) \
0079     _Py_atomic_load_ushort_relaxed(&value)
0080 #define FT_ATOMIC_STORE_INT_RELAXED(value, new_value) \
0081     _Py_atomic_store_int_relaxed(&value, new_value)
0082 #define FT_ATOMIC_LOAD_INT_RELAXED(value) \
0083     _Py_atomic_load_int_relaxed(&value)
0084 #define FT_ATOMIC_STORE_UINT_RELAXED(value, new_value) \
0085     _Py_atomic_store_uint_relaxed(&value, new_value)
0086 #define FT_ATOMIC_LOAD_UINT_RELAXED(value) \
0087     _Py_atomic_load_uint_relaxed(&value)
0088 #define FT_ATOMIC_STORE_LONG_RELAXED(value, new_value) \
0089     _Py_atomic_store_long_relaxed(&value, new_value)
0090 #define FT_ATOMIC_LOAD_LONG_RELAXED(value) \
0091     _Py_atomic_load_long_relaxed(&value)
0092 #define FT_ATOMIC_STORE_ULONG_RELAXED(value, new_value) \
0093     _Py_atomic_store_ulong_relaxed(&value, new_value)
0094 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) \
0095     _Py_atomic_store_ssize_relaxed(&value, new_value)
0096 #define FT_ATOMIC_STORE_FLOAT_RELAXED(value, new_value) \
0097     _Py_atomic_store_float_relaxed(&value, new_value)
0098 #define FT_ATOMIC_LOAD_FLOAT_RELAXED(value) \
0099     _Py_atomic_load_float_relaxed(&value)
0100 #define FT_ATOMIC_STORE_DOUBLE_RELAXED(value, new_value) \
0101     _Py_atomic_store_double_relaxed(&value, new_value)
0102 #define FT_ATOMIC_LOAD_DOUBLE_RELAXED(value) \
0103     _Py_atomic_load_double_relaxed(&value)
0104 #define FT_ATOMIC_STORE_LLONG_RELAXED(value, new_value) \
0105     _Py_atomic_store_llong_relaxed(&value, new_value)
0106 #define FT_ATOMIC_LOAD_LLONG_RELAXED(value) \
0107     _Py_atomic_load_llong_relaxed(&value)
0108 #define FT_ATOMIC_STORE_ULLONG_RELAXED(value, new_value) \
0109     _Py_atomic_store_ullong_relaxed(&value, new_value)
0110 #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) \
0111     _Py_atomic_load_ullong_relaxed(&value)
0112 
0113 #else
0114 #define FT_ATOMIC_LOAD_PTR(value) value
0115 #define FT_ATOMIC_STORE_PTR(value, new_value) value = new_value
0116 #define FT_ATOMIC_LOAD_SSIZE(value) value
0117 #define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) value
0118 #define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) value
0119 #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) value
0120 #define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) value
0121 #define FT_ATOMIC_LOAD_PTR_RELAXED(value) value
0122 #define FT_ATOMIC_LOAD_UINT8(value) value
0123 #define FT_ATOMIC_STORE_UINT8(value, new_value) value = new_value
0124 #define FT_ATOMIC_LOAD_UINT8_RELAXED(value) value
0125 #define FT_ATOMIC_LOAD_UINT16_RELAXED(value) value
0126 #define FT_ATOMIC_LOAD_UINT32_RELAXED(value) value
0127 #define FT_ATOMIC_LOAD_ULONG_RELAXED(value) value
0128 #define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) value = new_value
0129 #define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) value = new_value
0130 #define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) value = new_value
0131 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) value = new_value
0132 #define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) value = new_value
0133 #define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) value = new_value
0134 #define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) value = new_value
0135 #define FT_ATOMIC_LOAD_CHAR_RELAXED(value) value
0136 #define FT_ATOMIC_STORE_CHAR_RELAXED(value, new_value) value = new_value
0137 #define FT_ATOMIC_LOAD_UCHAR_RELAXED(value) value
0138 #define FT_ATOMIC_STORE_UCHAR_RELAXED(value, new_value) value = new_value
0139 #define FT_ATOMIC_LOAD_SHORT_RELAXED(value) value
0140 #define FT_ATOMIC_STORE_SHORT_RELAXED(value, new_value) value = new_value
0141 #define FT_ATOMIC_LOAD_USHORT_RELAXED(value) value
0142 #define FT_ATOMIC_STORE_USHORT_RELAXED(value, new_value) value = new_value
0143 #define FT_ATOMIC_LOAD_INT_RELAXED(value) value
0144 #define FT_ATOMIC_STORE_INT_RELAXED(value, new_value) value = new_value
0145 #define FT_ATOMIC_LOAD_UINT_RELAXED(value) value
0146 #define FT_ATOMIC_STORE_UINT_RELAXED(value, new_value) value = new_value
0147 #define FT_ATOMIC_LOAD_LONG_RELAXED(value) value
0148 #define FT_ATOMIC_STORE_LONG_RELAXED(value, new_value) value = new_value
0149 #define FT_ATOMIC_STORE_ULONG_RELAXED(value, new_value) value = new_value
0150 #define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) value = new_value
0151 #define FT_ATOMIC_LOAD_FLOAT_RELAXED(value) value
0152 #define FT_ATOMIC_STORE_FLOAT_RELAXED(value, new_value) value = new_value
0153 #define FT_ATOMIC_LOAD_DOUBLE_RELAXED(value) value
0154 #define FT_ATOMIC_STORE_DOUBLE_RELAXED(value, new_value) value = new_value
0155 #define FT_ATOMIC_LOAD_LLONG_RELAXED(value) value
0156 #define FT_ATOMIC_STORE_LLONG_RELAXED(value, new_value) value = new_value
0157 #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) value
0158 #define FT_ATOMIC_STORE_ULLONG_RELAXED(value, new_value) value = new_value
0159 
0160 #endif
0161 
0162 #ifdef __cplusplus
0163 }
0164 #endif
0165 #endif /* !Py_ATOMIC_FT_WRAPPERS_H */