Current Path: > > opt > > alt > python37 > include > python3.7m >
Operation : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 Software : Apache Server IP : 162.0.232.56 | Your IP: 216.73.216.111 Domains : 1034 Domain(s) Permission : [ 0755 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
internal | Directory | - | - | |
Python-ast.h | File | 21802 bytes | June 05 2023 20:46:05. | |
Python.h | File | 3554 bytes | June 05 2023 20:45:13. | |
abstract.h | File | 40798 bytes | June 05 2023 20:45:13. | |
accu.h | File | 1016 bytes | June 05 2023 20:45:13. | |
asdl.h | File | 1213 bytes | June 05 2023 20:45:13. | |
ast.h | File | 641 bytes | June 05 2023 20:45:13. | |
bitset.h | File | 810 bytes | June 05 2023 20:45:13. | |
bltinmodule.h | File | 264 bytes | June 05 2023 20:45:13. | |
boolobject.h | File | 886 bytes | June 05 2023 20:45:13. | |
bytearrayobject.h | File | 2114 bytes | June 05 2023 20:45:13. | |
bytes_methods.h | File | 3301 bytes | June 05 2023 20:45:13. | |
bytesobject.h | File | 8493 bytes | June 05 2023 20:45:13. | |
cellobject.h | File | 713 bytes | June 05 2023 20:45:13. | |
ceval.h | File | 8717 bytes | June 05 2023 20:45:13. | |
classobject.h | File | 1679 bytes | June 05 2023 20:45:13. | |
code.h | File | 6065 bytes | June 05 2023 20:45:13. | |
codecs.h | File | 6793 bytes | June 05 2023 20:45:13. | |
compile.h | File | 2946 bytes | June 05 2023 20:45:13. | |
complexobject.h | File | 1807 bytes | June 05 2023 20:45:13. | |
context.h | File | 2014 bytes | June 05 2023 20:45:13. | |
datetime.h | File | 9848 bytes | June 05 2023 20:45:13. | |
descrobject.h | File | 3135 bytes | June 05 2023 20:45:13. | |
dictobject.h | File | 7323 bytes | June 05 2023 20:45:13. | |
dtoa.h | File | 458 bytes | June 05 2023 20:45:13. | |
dynamic_annotations.h | File | 22469 bytes | June 05 2023 20:45:13. | |
enumobject.h | File | 253 bytes | June 05 2023 20:45:13. | |
errcode.h | File | 1695 bytes | June 05 2023 20:45:13. | |
eval.h | File | 1209 bytes | June 05 2023 20:45:13. | |
fileobject.h | File | 1811 bytes | June 05 2023 20:45:13. | |
fileutils.h | File | 4534 bytes | June 05 2023 20:45:13. | |
floatobject.h | File | 4794 bytes | June 05 2023 20:45:13. | |
frameobject.h | File | 3318 bytes | June 05 2023 20:45:13. | |
funcobject.h | File | 4178 bytes | June 05 2023 20:45:13. | |
genobject.h | File | 3646 bytes | June 05 2023 20:45:13. | |
graminit.h | File | 1992 bytes | June 05 2023 20:45:13. | |
grammar.h | File | 2319 bytes | June 05 2023 20:45:13. | |
import.h | File | 4977 bytes | June 05 2023 20:45:13. | |
intrcheck.h | File | 861 bytes | June 05 2023 20:45:13. | |
iterobject.h | File | 567 bytes | June 05 2023 20:45:13. | |
listobject.h | File | 2927 bytes | June 05 2023 20:45:13. | |
longintrepr.h | File | 3799 bytes | June 05 2023 20:45:13. | |
longobject.h | File | 8594 bytes | June 05 2023 20:45:13. | |
marshal.h | File | 803 bytes | June 05 2023 20:45:13. | |
memoryobject.h | File | 2765 bytes | June 05 2023 20:45:13. | |
metagrammar.h | File | 253 bytes | June 05 2023 20:45:13. | |
methodobject.h | File | 4519 bytes | June 05 2023 20:45:13. | |
modsupport.h | File | 8559 bytes | June 05 2023 20:45:13. | |
moduleobject.h | File | 2304 bytes | June 05 2023 20:45:13. | |
namespaceobject.h | File | 349 bytes | June 05 2023 20:45:13. | |
node.h | File | 1113 bytes | June 05 2023 20:45:13. | |
object.h | File | 41842 bytes | June 05 2023 20:45:13. | |
objimpl.h | File | 14474 bytes | June 05 2023 20:45:13. | |
odictobject.h | File | 1280 bytes | June 05 2023 20:45:13. | |
opcode.h | File | 5109 bytes | June 05 2023 20:45:13. | |
osdefs.h | File | 691 bytes | June 05 2023 20:45:13. | |
osmodule.h | File | 291 bytes | June 05 2023 20:45:13. | |
parsetok.h | File | 2905 bytes | June 05 2023 20:45:13. | |
patchlevel.h | File | 1299 bytes | June 05 2023 20:45:13. | |
pgen.h | File | 253 bytes | June 05 2023 20:45:13. | |
pgenheaders.h | File | 1222 bytes | June 05 2023 20:45:13. | |
py_curses.h | File | 4062 bytes | June 05 2023 20:45:13. | |
pyarena.h | File | 2744 bytes | June 05 2023 20:45:13. | |
pyatomic.h | File | 16121 bytes | June 05 2023 20:45:13. | |
pycapsule.h | File | 1726 bytes | June 05 2023 20:45:13. | |
pyconfig-64.h | File | 45308 bytes | April 17 2024 17:33:22. | |
pyconfig.h | File | 162 bytes | April 17 2024 17:35:58. | |
pyctype.h | File | 1320 bytes | June 05 2023 20:45:13. | |
pydebug.h | File | 1214 bytes | June 05 2023 20:45:13. | |
pydtrace.h | File | 2285 bytes | June 05 2023 20:45:13. | |
pyerrors.h | File | 17369 bytes | June 05 2023 20:45:13. | |
pyexpat.h | File | 2450 bytes | June 05 2023 20:45:13. | |
pyfpe.h | File | 341 bytes | June 05 2023 20:45:13. | |
pyhash.h | File | 4139 bytes | June 05 2023 20:45:13. | |
pylifecycle.h | File | 7780 bytes | June 05 2023 20:45:13. | |
pymacconfig.h | File | 2989 bytes | June 05 2023 20:45:13. | |
pymacro.h | File | 3535 bytes | June 05 2023 20:45:13. | |
pymath.h | File | 8312 bytes | June 05 2023 20:45:13. | |
pymem.h | File | 8993 bytes | June 05 2023 20:45:13. | |
pyport.h | File | 28235 bytes | June 05 2023 20:45:13. | |
pystate.h | File | 16324 bytes | June 05 2023 20:45:13. | |
pystrcmp.h | File | 436 bytes | June 05 2023 20:45:13. | |
pystrhex.h | File | 495 bytes | June 05 2023 20:45:13. | |
pystrtod.h | File | 1483 bytes | June 05 2023 20:45:13. | |
pythonrun.h | File | 6204 bytes | June 05 2023 20:45:13. | |
pythread.h | File | 5332 bytes | June 05 2023 20:45:13. | |
pytime.h | File | 8926 bytes | June 05 2023 20:45:13. | |
rangeobject.h | File | 629 bytes | June 05 2023 20:45:13. | |
setobject.h | File | 3362 bytes | June 05 2023 20:45:13. | |
sliceobject.h | File | 2480 bytes | June 05 2023 20:45:13. | |
structmember.h | File | 2030 bytes | June 05 2023 20:45:13. | |
structseq.h | File | 1377 bytes | June 05 2023 20:45:13. | |
symtable.h | File | 4928 bytes | June 05 2023 20:45:13. | |
sysmodule.h | File | 1511 bytes | June 05 2023 20:45:13. | |
token.h | File | 2480 bytes | June 05 2023 20:45:13. | |
traceback.h | File | 3644 bytes | June 05 2023 20:45:13. | |
tupleobject.h | File | 2471 bytes | June 05 2023 20:45:13. | |
typeslots.h | File | 2253 bytes | June 05 2023 20:45:13. | |
ucnhash.h | File | 1056 bytes | June 05 2023 20:45:13. | |
unicodeobject.h | File | 82278 bytes | June 05 2023 20:45:13. | |
warnings.h | File | 1776 bytes | June 05 2023 20:45:13. | |
weakrefobject.h | File | 2866 bytes | June 05 2023 20:45:13. |
#ifndef Py_ATOMIC_H #define Py_ATOMIC_H #ifdef Py_BUILD_CORE #include "dynamic_annotations.h" #include "pyconfig.h" #if defined(HAVE_STD_ATOMIC) #include <stdatomic.h> #endif #if defined(_MSC_VER) #include <intrin.h> #include <immintrin.h> #endif /* This is modeled after the atomics interface from C1x, according to * the draft at * http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf. * Operations and types are named the same except with a _Py_ prefix * and have the same semantics. * * Beware, the implementations here are deep magic. */ #if defined(HAVE_STD_ATOMIC) typedef enum _Py_memory_order { _Py_memory_order_relaxed = memory_order_relaxed, _Py_memory_order_acquire = memory_order_acquire, _Py_memory_order_release = memory_order_release, _Py_memory_order_acq_rel = memory_order_acq_rel, _Py_memory_order_seq_cst = memory_order_seq_cst } _Py_memory_order; typedef struct _Py_atomic_address { atomic_uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { atomic_int _value; } _Py_atomic_int; #define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ atomic_signal_fence(ORDER) #define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ atomic_thread_fence(ORDER) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) /* Use builtin atomic operations in GCC >= 4.7 */ #elif defined(HAVE_BUILTIN_ATOMIC) typedef enum _Py_memory_order { _Py_memory_order_relaxed = __ATOMIC_RELAXED, _Py_memory_order_acquire = __ATOMIC_ACQUIRE, _Py_memory_order_release = __ATOMIC_RELEASE, _Py_memory_order_acq_rel = __ATOMIC_ACQ_REL, _Py_memory_order_seq_cst = __ATOMIC_SEQ_CST } _Py_memory_order; typedef struct _Py_atomic_address { uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { int _value; } _Py_atomic_int; #define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ __atomic_signal_fence(ORDER) #define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ __atomic_thread_fence(ORDER) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_RELEASE), \ __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_ACQUIRE \ || (ORDER) == __ATOMIC_CONSUME), \ __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) /* Only support GCC (for expression statements) and x86 (for simple * atomic semantics) and MSVC x86/x64/ARM */ #elif defined(__GNUC__) && (defined(__i386__) || defined(__amd64)) typedef enum _Py_memory_order { _Py_memory_order_relaxed, _Py_memory_order_acquire, _Py_memory_order_release, _Py_memory_order_acq_rel, _Py_memory_order_seq_cst } _Py_memory_order; typedef struct _Py_atomic_address { uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { int _value; } _Py_atomic_int; static __inline__ void _Py_atomic_signal_fence(_Py_memory_order order) { if (order != _Py_memory_order_relaxed) __asm__ volatile("":::"memory"); } static __inline__ void _Py_atomic_thread_fence(_Py_memory_order order) { if (order != _Py_memory_order_relaxed) __asm__ volatile("mfence":::"memory"); } /* Tell the race checker about this operation's effects. */ static __inline__ void _Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order) { (void)address; /* shut up -Wunused-parameter */ switch(order) { case _Py_memory_order_release: case _Py_memory_order_acq_rel: case _Py_memory_order_seq_cst: _Py_ANNOTATE_HAPPENS_BEFORE(address); break; case _Py_memory_order_relaxed: case _Py_memory_order_acquire: break; } switch(order) { case _Py_memory_order_acquire: case _Py_memory_order_acq_rel: case _Py_memory_order_seq_cst: _Py_ANNOTATE_HAPPENS_AFTER(address); break; case _Py_memory_order_relaxed: case _Py_memory_order_release: break; } } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ __extension__ ({ \ __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ __typeof__(atomic_val->_value) new_val = NEW_VAL;\ volatile __typeof__(new_val) *volatile_data = &atomic_val->_value; \ _Py_memory_order order = ORDER; \ _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ \ /* Perform the operation. */ \ _Py_ANNOTATE_IGNORE_WRITES_BEGIN(); \ switch(order) { \ case _Py_memory_order_release: \ _Py_atomic_signal_fence(_Py_memory_order_release); \ /* fallthrough */ \ case _Py_memory_order_relaxed: \ *volatile_data = new_val; \ break; \ \ case _Py_memory_order_acquire: \ case _Py_memory_order_acq_rel: \ case _Py_memory_order_seq_cst: \ __asm__ volatile("xchg %0, %1" \ : "+r"(new_val) \ : "m"(atomic_val->_value) \ : "memory"); \ break; \ } \ _Py_ANNOTATE_IGNORE_WRITES_END(); \ }) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ __extension__ ({ \ __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ __typeof__(atomic_val->_value) result; \ volatile __typeof__(result) *volatile_data = &atomic_val->_value; \ _Py_memory_order order = ORDER; \ _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ \ /* Perform the operation. */ \ _Py_ANNOTATE_IGNORE_READS_BEGIN(); \ switch(order) { \ case _Py_memory_order_release: \ case _Py_memory_order_acq_rel: \ case _Py_memory_order_seq_cst: \ /* Loads on x86 are not releases by default, so need a */ \ /* thread fence. */ \ _Py_atomic_thread_fence(_Py_memory_order_release); \ break; \ default: \ /* No fence */ \ break; \ } \ result = *volatile_data; \ switch(order) { \ case _Py_memory_order_acquire: \ case _Py_memory_order_acq_rel: \ case _Py_memory_order_seq_cst: \ /* Loads on x86 are automatically acquire operations so */ \ /* can get by with just a compiler fence. */ \ _Py_atomic_signal_fence(_Py_memory_order_acquire); \ break; \ default: \ /* No fence */ \ break; \ } \ _Py_ANNOTATE_IGNORE_READS_END(); \ result; \ }) #elif defined(_MSC_VER) /* _Interlocked* functions provide a full memory barrier and are therefore enough for acq_rel and seq_cst. If the HLE variants aren't available in hardware they will fall back to a full memory barrier as well. This might affect performance but likely only in some very specific and hard to meassure scenario. */ #if defined(_M_IX86) || defined(_M_X64) typedef enum _Py_memory_order { _Py_memory_order_relaxed, _Py_memory_order_acquire, _Py_memory_order_release, _Py_memory_order_acq_rel, _Py_memory_order_seq_cst } _Py_memory_order; typedef struct _Py_atomic_address { volatile uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { volatile int _value; } _Py_atomic_int; #if defined(_M_X64) #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ _InterlockedExchange64_HLEAcquire((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ case _Py_memory_order_release: \ _InterlockedExchange64_HLERelease((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ default: \ _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ } #else #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); #endif #define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ _InterlockedExchange_HLEAcquire((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ case _Py_memory_order_release: \ _InterlockedExchange_HLERelease((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ default: \ _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ } #if defined(_M_X64) /* This has to be an intptr_t for now. gil_created() uses -1 as a sentinel value, if this returns a uintptr_t it will do an unsigned compare and crash */ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { __int64 old; switch (order) { case _Py_memory_order_acquire: { do { old = *value; } while(_InterlockedCompareExchange64_HLEAcquire((volatile __int64*)value, old, old) != old); break; } case _Py_memory_order_release: { do { old = *value; } while(_InterlockedCompareExchange64_HLERelease((volatile __int64*)value, old, old) != old); break; } case _Py_memory_order_relaxed: old = *value; break; default: { do { old = *value; } while(_InterlockedCompareExchange64((volatile __int64*)value, old, old) != old); break; } } return old; } #else #define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { long old; switch (order) { case _Py_memory_order_acquire: { do { old = *value; } while(_InterlockedCompareExchange_HLEAcquire((volatile long*)value, old, old) != old); break; } case _Py_memory_order_release: { do { old = *value; } while(_InterlockedCompareExchange_HLERelease((volatile long*)value, old, old) != old); break; } case _Py_memory_order_relaxed: old = *value; break; default: { do { old = *value; } while(_InterlockedCompareExchange((volatile long*)value, old, old) != old); break; } } return old; } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ if (sizeof(*ATOMIC_VAL._value) == 8) { \ _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ sizeof(*(ATOMIC_VAL._value)) == 8 ? \ _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ ) #elif defined(_M_ARM) || defined(_M_ARM64) typedef enum _Py_memory_order { _Py_memory_order_relaxed, _Py_memory_order_acquire, _Py_memory_order_release, _Py_memory_order_acq_rel, _Py_memory_order_seq_cst } _Py_memory_order; typedef struct _Py_atomic_address { volatile uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { volatile int _value; } _Py_atomic_int; #if defined(_M_ARM64) #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ case _Py_memory_order_release: \ _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ default: \ _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ } #else #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); #endif #define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ case _Py_memory_order_release: \ _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ default: \ _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ } #if defined(_M_ARM64) /* This has to be an intptr_t for now. gil_created() uses -1 as a sentinel value, if this returns a uintptr_t it will do an unsigned compare and crash */ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { uintptr_t old; switch (order) { case _Py_memory_order_acquire: { do { old = *value; } while(_InterlockedCompareExchange64_acq(value, old, old) != old); break; } case _Py_memory_order_release: { do { old = *value; } while(_InterlockedCompareExchange64_rel(value, old, old) != old); break; } case _Py_memory_order_relaxed: old = *value; break; default: { do { old = *value; } while(_InterlockedCompareExchange64(value, old, old) != old); break; } } return old; } #else #define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { int old; switch (order) { case _Py_memory_order_acquire: { do { old = *value; } while(_InterlockedCompareExchange_acq(value, old, old) != old); break; } case _Py_memory_order_release: { do { old = *value; } while(_InterlockedCompareExchange_rel(value, old, old) != old); break; } case _Py_memory_order_relaxed: old = *value; break; default: { do { old = *value; } while(_InterlockedCompareExchange(value, old, old) != old); break; } } return old; } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ if (sizeof(*ATOMIC_VAL._value) == 8) { \ _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ sizeof(*(ATOMIC_VAL._value)) == 8 ? \ _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ ) #endif #else /* !gcc x86 !_msc_ver */ typedef enum _Py_memory_order { _Py_memory_order_relaxed, _Py_memory_order_acquire, _Py_memory_order_release, _Py_memory_order_acq_rel, _Py_memory_order_seq_cst } _Py_memory_order; typedef struct _Py_atomic_address { uintptr_t _value; } _Py_atomic_address; typedef struct _Py_atomic_int { int _value; } _Py_atomic_int; /* Fall back to other compilers and processors by assuming that simple volatile accesses are atomic. This is false, so people should port this. */ #define _Py_atomic_signal_fence(/*memory_order*/ ORDER) ((void)0) #define _Py_atomic_thread_fence(/*memory_order*/ ORDER) ((void)0) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ ((ATOMIC_VAL)->_value = NEW_VAL) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ((ATOMIC_VAL)->_value) #endif /* Standardized shortcuts. */ #define _Py_atomic_store(ATOMIC_VAL, NEW_VAL) \ _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_seq_cst) #define _Py_atomic_load(ATOMIC_VAL) \ _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_seq_cst) /* Python-local extensions */ #define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_relaxed) #define _Py_atomic_load_relaxed(ATOMIC_VAL) \ _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed) #endif /* Py_BUILD_CORE */ #endif /* Py_ATOMIC_H */
SILENT KILLER Tool