__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
#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
/* 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))
#else
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;
/* Only support GCC (for expression statements) and x86 (for simple
* atomic semantics) for now */
#if defined(__GNUC__) && (defined(__i386__) || defined(__amd64))
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; \
})
#else /* !gcc x86 */
/* 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 /* !gcc x86 */
#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 */
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| Python-ast.h | File | 21.75 KB | 0644 |
|
| Python.h | File | 3.15 KB | 0644 |
|
| _hashopenssl.h | File | 1.33 KB | 0644 |
|
| abstract.h | File | 46.34 KB | 0644 |
|
| accu.h | File | 1016 B | 0644 |
|
| asdl.h | File | 1.18 KB | 0644 |
|
| ast.h | File | 477 B | 0644 |
|
| bitset.h | File | 792 B | 0644 |
|
| bltinmodule.h | File | 264 B | 0644 |
|
| boolobject.h | File | 886 B | 0644 |
|
| bytearrayobject.h | File | 2.06 KB | 0644 |
|
| bytes_methods.h | File | 3.12 KB | 0644 |
|
| bytesobject.h | File | 8.17 KB | 0644 |
|
| cellobject.h | File | 701 B | 0644 |
|
| ceval.h | File | 8.32 KB | 0644 |
|
| classobject.h | File | 1.63 KB | 0644 |
|
| code.h | File | 5.81 KB | 0644 |
|
| codecs.h | File | 6.63 KB | 0644 |
|
| compile.h | File | 2.11 KB | 0644 |
|
| complexobject.h | File | 1.76 KB | 0644 |
|
| datetime.h | File | 9.19 KB | 0644 |
|
| descrobject.h | File | 2.89 KB | 0644 |
|
| dictobject.h | File | 7.01 KB | 0644 |
|
| dtoa.h | File | 458 B | 0644 |
|
| dynamic_annotations.h | File | 21.94 KB | 0644 |
|
| enumobject.h | File | 253 B | 0644 |
|
| errcode.h | File | 1.46 KB | 0644 |
|
| eval.h | File | 597 B | 0644 |
|
| fileobject.h | File | 1.61 KB | 0644 |
|
| fileutils.h | File | 3.44 KB | 0644 |
|
| floatobject.h | File | 4.68 KB | 0644 |
|
| frameobject.h | File | 3.45 KB | 0644 |
|
| funcobject.h | File | 3.98 KB | 0644 |
|
| genobject.h | File | 3.5 KB | 0644 |
|
| graminit.h | File | 1.92 KB | 0644 |
|
| grammar.h | File | 2.03 KB | 0644 |
|
| import.h | File | 4.13 KB | 0644 |
|
| intrcheck.h | File | 513 B | 0644 |
|
| iterobject.h | File | 567 B | 0644 |
|
| listobject.h | File | 2.83 KB | 0644 |
|
| longintrepr.h | File | 3.67 KB | 0644 |
|
| longobject.h | File | 9.6 KB | 0644 |
|
| marshal.h | File | 803 B | 0644 |
|
| memoryobject.h | File | 2.7 KB | 0644 |
|
| metagrammar.h | File | 253 B | 0644 |
|
| methodobject.h | File | 3.76 KB | 0644 |
|
| modsupport.h | File | 7.15 KB | 0644 |
|
| moduleobject.h | File | 2.23 KB | 0644 |
|
| namespaceobject.h | File | 349 B | 0644 |
|
| node.h | File | 1007 B | 0644 |
|
| object.h | File | 41.21 KB | 0644 |
|
| objimpl.h | File | 13.91 KB | 0644 |
|
| odictobject.h | File | 1.26 KB | 0644 |
|
| opcode.h | File | 4.95 KB | 0644 |
|
| osdefs.h | File | 691 B | 0644 |
|
| osmodule.h | File | 291 B | 0644 |
|
| parsetok.h | File | 2.82 KB | 0644 |
|
| patchlevel.h | File | 1.1 KB | 0644 |
|
| pgen.h | File | 253 B | 0644 |
|
| pgenheaders.h | File | 1.15 KB | 0644 |
|
| py_curses.h | File | 4.21 KB | 0644 |
|
| pyarena.h | File | 2.68 KB | 0644 |
|
| pyatomic.h | File | 7.94 KB | 0644 |
|
| pycapsule.h | File | 1.69 KB | 0644 |
|
| pyconfig-64.h | File | 43.58 KB | 0644 |
|
| pyconfig.h | File | 162 B | 0644 |
|
| pyctype.h | File | 1.29 KB | 0644 |
|
| pydebug.h | File | 1.23 KB | 0644 |
|
| pydtrace.h | File | 1.92 KB | 0644 |
|
| pyerrors.h | File | 16.82 KB | 0644 |
|
| pyexpat.h | File | 2.39 KB | 0644 |
|
| pyfpe.h | File | 8.27 KB | 0644 |
|
| pygetopt.h | File | 410 B | 0644 |
|
| pyhash.h | File | 4.04 KB | 0644 |
|
| pylifecycle.h | File | 3.98 KB | 0644 |
|
| pymacconfig.h | File | 2.92 KB | 0644 |
|
| pymacro.h | File | 3.42 KB | 0644 |
|
| pymath.h | File | 8.12 KB | 0644 |
|
| pymem.h | File | 8.36 KB | 0644 |
|
| pyport.h | File | 26.93 KB | 0644 |
|
| pystate.h | File | 10.88 KB | 0644 |
|
| pystrcmp.h | File | 436 B | 0644 |
|
| pystrhex.h | File | 495 B | 0644 |
|
| pystrtod.h | File | 1.45 KB | 0644 |
|
| pythonrun.h | File | 6.62 KB | 0644 |
|
| pythread.h | File | 2.92 KB | 0644 |
|
| pytime.h | File | 7.43 KB | 0644 |
|
| rangeobject.h | File | 629 B | 0644 |
|
| setobject.h | File | 3.25 KB | 0644 |
|
| sliceobject.h | File | 2.43 KB | 0644 |
|
| structmember.h | File | 1.97 KB | 0644 |
|
| structseq.h | File | 1.32 KB | 0644 |
|
| symtable.h | File | 4.88 KB | 0644 |
|
| sysmodule.h | File | 1.32 KB | 0644 |
|
| token.h | File | 1.9 KB | 0644 |
|
| traceback.h | File | 3.56 KB | 0644 |
|
| tupleobject.h | File | 2.39 KB | 0644 |
|
| typeslots.h | File | 2.2 KB | 0644 |
|
| ucnhash.h | File | 1.03 KB | 0644 |
|
| unicodeobject.h | File | 79.86 KB | 0644 |
|
| warnings.h | File | 1.65 KB | 0644 |
|
| weakrefobject.h | File | 2.8 KB | 0644 |
|