codekingpro/portable-devtools
115k
1// This is the implementation of Python atomic operations using C++11 or C112// atomics. Note that the pyatomic_gcc.h implementation is preferred for GCC3// compatible compilers, even if they support C++11 atomics.4 5#ifndef Py_ATOMIC_STD_H6# error "this header file must not be included directly"7#endif8 9#ifdef __cplusplus10extern "C++" {11# include <atomic>12}13# define _Py_USING_STD using namespace std14# define _Atomic(tp) atomic<tp>15#else16# define _Py_USING_STD17# include <stdatomic.h>18#endif19 20 21// --- _Py_atomic_add --------------------------------------------------------22 23static inline int24_Py_atomic_add_int(int *obj, int value)25{26 _Py_USING_STD;27 return atomic_fetch_add((_Atomic(int)*)obj, value);28}29 30static inline int8_t31_Py_atomic_add_int8(int8_t *obj, int8_t value)32{33 _Py_USING_STD;34 return atomic_fetch_add((_Atomic(int8_t)*)obj, value);35}36 37static inline int16_t38_Py_atomic_add_int16(int16_t *obj, int16_t value)39{40 _Py_USING_STD;41 return atomic_fetch_add((_Atomic(int16_t)*)obj, value);42}43 44static inline int32_t45_Py_atomic_add_int32(int32_t *obj, int32_t value)46{47 _Py_USING_STD;48 return atomic_fetch_add((_Atomic(int32_t)*)obj, value);49}50 51static inline int64_t52_Py_atomic_add_int64(int64_t *obj, int64_t value)53{54 _Py_USING_STD;55 return atomic_fetch_add((_Atomic(int64_t)*)obj, value);56}57 58static inline intptr_t59_Py_atomic_add_intptr(intptr_t *obj, intptr_t value)60{61 _Py_USING_STD;62 return atomic_fetch_add((_Atomic(intptr_t)*)obj, value);63}64 65static inline unsigned int66_Py_atomic_add_uint(unsigned int *obj, unsigned int value)67{68 _Py_USING_STD;69 return atomic_fetch_add((_Atomic(unsigned int)*)obj, value);70}71 72static inline uint8_t73_Py_atomic_add_uint8(uint8_t *obj, uint8_t value)74{75 _Py_USING_STD;76 return atomic_fetch_add((_Atomic(uint8_t)*)obj, value);77}78 79static inline uint16_t80_Py_atomic_add_uint16(uint16_t *obj, uint16_t value)81{82 _Py_USING_STD;83 return atomic_fetch_add((_Atomic(uint16_t)*)obj, value);84}85 86static inline uint32_t87_Py_atomic_add_uint32(uint32_t *obj, uint32_t value)88{89 _Py_USING_STD;90 return atomic_fetch_add((_Atomic(uint32_t)*)obj, value);91}92 93static inline uint64_t94_Py_atomic_add_uint64(uint64_t *obj, uint64_t value)95{96 _Py_USING_STD;97 return atomic_fetch_add((_Atomic(uint64_t)*)obj, value);98}99 100static inline uintptr_t101_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value)102{103 _Py_USING_STD;104 return atomic_fetch_add((_Atomic(uintptr_t)*)obj, value);105}106 107static inline Py_ssize_t108_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value)109{110 _Py_USING_STD;111 return atomic_fetch_add((_Atomic(Py_ssize_t)*)obj, value);112}113 114 115// --- _Py_atomic_compare_exchange -------------------------------------------116 117static inline int118_Py_atomic_compare_exchange_int(int *obj, int *expected, int desired)119{120 _Py_USING_STD;121 return atomic_compare_exchange_strong((_Atomic(int)*)obj,122 expected, desired);123}124 125static inline int126_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t desired)127{128 _Py_USING_STD;129 return atomic_compare_exchange_strong((_Atomic(int8_t)*)obj,130 expected, desired);131}132 133static inline int134_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t desired)135{136 _Py_USING_STD;137 return atomic_compare_exchange_strong((_Atomic(int16_t)*)obj,138 expected, desired);139}140 141static inline int142_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t desired)143{144 _Py_USING_STD;145 return atomic_compare_exchange_strong((_Atomic(int32_t)*)obj,146 expected, desired);147}148 149static inline int150_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t desired)151{152 _Py_USING_STD;153 return atomic_compare_exchange_strong((_Atomic(int64_t)*)obj,154 expected, desired);155}156 157static inline int158_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t desired)159{160 _Py_USING_STD;161 return atomic_compare_exchange_strong((_Atomic(intptr_t)*)obj,162 expected, desired);163}164 165static inline int166_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int desired)167{168 _Py_USING_STD;169 return atomic_compare_exchange_strong((_Atomic(unsigned int)*)obj,170 expected, desired);171}172 173static inline int174_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t desired)175{176 _Py_USING_STD;177 return atomic_compare_exchange_strong((_Atomic(uint8_t)*)obj,178 expected, desired);179}180 181static inline int182_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t desired)183{184 _Py_USING_STD;185 return atomic_compare_exchange_strong((_Atomic(uint16_t)*)obj,186 expected, desired);187}188 189static inline int190_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t desired)191{192 _Py_USING_STD;193 return atomic_compare_exchange_strong((_Atomic(uint32_t)*)obj,194 expected, desired);195}196 197static inline int198_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t desired)199{200 _Py_USING_STD;201 return atomic_compare_exchange_strong((_Atomic(uint64_t)*)obj,202 expected, desired);203}204 205static inline int206_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t desired)207{208 _Py_USING_STD;209 return atomic_compare_exchange_strong((_Atomic(uintptr_t)*)obj,210 expected, desired);211}212 213static inline int214_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t desired)215{216 _Py_USING_STD;217 return atomic_compare_exchange_strong((_Atomic(Py_ssize_t)*)obj,218 expected, desired);219}220 221static inline int222_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *desired)223{224 _Py_USING_STD;225 return atomic_compare_exchange_strong((_Atomic(void *)*)obj,226 (void **)expected, desired);227}228 229 230// --- _Py_atomic_exchange ---------------------------------------------------231 232static inline int233_Py_atomic_exchange_int(int *obj, int value)234{235 _Py_USING_STD;236 return atomic_exchange((_Atomic(int)*)obj, value);237}238 239static inline int8_t240_Py_atomic_exchange_int8(int8_t *obj, int8_t value)241{242 _Py_USING_STD;243 return atomic_exchange((_Atomic(int8_t)*)obj, value);244}245 246static inline int16_t247_Py_atomic_exchange_int16(int16_t *obj, int16_t value)248{249 _Py_USING_STD;250 return atomic_exchange((_Atomic(int16_t)*)obj, value);251}252 253static inline int32_t254_Py_atomic_exchange_int32(int32_t *obj, int32_t value)255{256 _Py_USING_STD;257 return atomic_exchange((_Atomic(int32_t)*)obj, value);258}259 260static inline int64_t261_Py_atomic_exchange_int64(int64_t *obj, int64_t value)262{263 _Py_USING_STD;264 return atomic_exchange((_Atomic(int64_t)*)obj, value);265}266 267static inline intptr_t268_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value)269{270 _Py_USING_STD;271 return atomic_exchange((_Atomic(intptr_t)*)obj, value);272}273 274static inline unsigned int275_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value)276{277 _Py_USING_STD;278 return atomic_exchange((_Atomic(unsigned int)*)obj, value);279}280 281static inline uint8_t282_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value)283{284 _Py_USING_STD;285 return atomic_exchange((_Atomic(uint8_t)*)obj, value);286}287 288static inline uint16_t289_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value)290{291 _Py_USING_STD;292 return atomic_exchange((_Atomic(uint16_t)*)obj, value);293}294 295static inline uint32_t296_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value)297{298 _Py_USING_STD;299 return atomic_exchange((_Atomic(uint32_t)*)obj, value);300}301 302static inline uint64_t303_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value)304{305 _Py_USING_STD;306 return atomic_exchange((_Atomic(uint64_t)*)obj, value);307}308 309static inline uintptr_t310_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value)311{312 _Py_USING_STD;313 return atomic_exchange((_Atomic(uintptr_t)*)obj, value);314}315 316static inline Py_ssize_t317_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value)318{319 _Py_USING_STD;320 return atomic_exchange((_Atomic(Py_ssize_t)*)obj, value);321}322 323static inline void*324_Py_atomic_exchange_ptr(void *obj, void *value)325{326 _Py_USING_STD;327 return atomic_exchange((_Atomic(void *)*)obj, value);328}329 330 331// --- _Py_atomic_and --------------------------------------------------------332 333static inline uint8_t334_Py_atomic_and_uint8(uint8_t *obj, uint8_t value)335{336 _Py_USING_STD;337 return atomic_fetch_and((_Atomic(uint8_t)*)obj, value);338}339 340static inline uint16_t341_Py_atomic_and_uint16(uint16_t *obj, uint16_t value)342{343 _Py_USING_STD;344 return atomic_fetch_and((_Atomic(uint16_t)*)obj, value);345}346 347static inline uint32_t348_Py_atomic_and_uint32(uint32_t *obj, uint32_t value)349{350 _Py_USING_STD;351 return atomic_fetch_and((_Atomic(uint32_t)*)obj, value);352}353 354static inline uint64_t355_Py_atomic_and_uint64(uint64_t *obj, uint64_t value)356{357 _Py_USING_STD;358 return atomic_fetch_and((_Atomic(uint64_t)*)obj, value);359}360 361static inline uintptr_t362_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value)363{364 _Py_USING_STD;365 return atomic_fetch_and((_Atomic(uintptr_t)*)obj, value);366}367 368 369// --- _Py_atomic_or ---------------------------------------------------------370 371static inline uint8_t372_Py_atomic_or_uint8(uint8_t *obj, uint8_t value)373{374 _Py_USING_STD;375 return atomic_fetch_or((_Atomic(uint8_t)*)obj, value);376}377 378static inline uint16_t379_Py_atomic_or_uint16(uint16_t *obj, uint16_t value)380{381 _Py_USING_STD;382 return atomic_fetch_or((_Atomic(uint16_t)*)obj, value);383}384 385static inline uint32_t386_Py_atomic_or_uint32(uint32_t *obj, uint32_t value)387{388 _Py_USING_STD;389 return atomic_fetch_or((_Atomic(uint32_t)*)obj, value);390}391 392static inline uint64_t393_Py_atomic_or_uint64(uint64_t *obj, uint64_t value)394{395 _Py_USING_STD;396 return atomic_fetch_or((_Atomic(uint64_t)*)obj, value);397}398 399static inline uintptr_t400_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value)401{402 _Py_USING_STD;403 return atomic_fetch_or((_Atomic(uintptr_t)*)obj, value);404}405 406 407// --- _Py_atomic_load -------------------------------------------------------408 409static inline int410_Py_atomic_load_int(const int *obj)411{412 _Py_USING_STD;413 return atomic_load((const _Atomic(int)*)obj);414}415 416static inline int8_t417_Py_atomic_load_int8(const int8_t *obj)418{419 _Py_USING_STD;420 return atomic_load((const _Atomic(int8_t)*)obj);421}422 423static inline int16_t424_Py_atomic_load_int16(const int16_t *obj)425{426 _Py_USING_STD;427 return atomic_load((const _Atomic(int16_t)*)obj);428}429 430static inline int32_t431_Py_atomic_load_int32(const int32_t *obj)432{433 _Py_USING_STD;434 return atomic_load((const _Atomic(int32_t)*)obj);435}436 437static inline int64_t438_Py_atomic_load_int64(const int64_t *obj)439{440 _Py_USING_STD;441 return atomic_load((const _Atomic(int64_t)*)obj);442}443 444static inline intptr_t445_Py_atomic_load_intptr(const intptr_t *obj)446{447 _Py_USING_STD;448 return atomic_load((const _Atomic(intptr_t)*)obj);449}450 451static inline uint8_t452_Py_atomic_load_uint8(const uint8_t *obj)453{454 _Py_USING_STD;455 return atomic_load((const _Atomic(uint8_t)*)obj);456}457 458static inline uint16_t459_Py_atomic_load_uint16(const uint16_t *obj)460{461 _Py_USING_STD;462 return atomic_load((const _Atomic(uint16_t)*)obj);463}464 465static inline uint32_t466_Py_atomic_load_uint32(const uint32_t *obj)467{468 _Py_USING_STD;469 return atomic_load((const _Atomic(uint32_t)*)obj);470}471 472static inline uint64_t473_Py_atomic_load_uint64(const uint64_t *obj)474{475 _Py_USING_STD;476 return atomic_load((const _Atomic(uint64_t)*)obj);477}478 479static inline uintptr_t480_Py_atomic_load_uintptr(const uintptr_t *obj)481{482 _Py_USING_STD;483 return atomic_load((const _Atomic(uintptr_t)*)obj);484}485 486static inline unsigned int487_Py_atomic_load_uint(const unsigned int *obj)488{489 _Py_USING_STD;490 return atomic_load((const _Atomic(unsigned int)*)obj);491}492 493static inline Py_ssize_t494_Py_atomic_load_ssize(const Py_ssize_t *obj)495{496 _Py_USING_STD;497 return atomic_load((const _Atomic(Py_ssize_t)*)obj);498}499 500static inline void*501_Py_atomic_load_ptr(const void *obj)502{503 _Py_USING_STD;504 return atomic_load((const _Atomic(void*)*)obj);505}506 507 508// --- _Py_atomic_load_relaxed -----------------------------------------------509 510static inline int511_Py_atomic_load_int_relaxed(const int *obj)512{513 _Py_USING_STD;514 return atomic_load_explicit((const _Atomic(int)*)obj,515 memory_order_relaxed);516}517 518static inline char519_Py_atomic_load_char_relaxed(const char *obj)520{521 _Py_USING_STD;522 return atomic_load_explicit((const _Atomic(char)*)obj,523 memory_order_relaxed);524}525 526static inline unsigned char527_Py_atomic_load_uchar_relaxed(const unsigned char *obj)528{529 _Py_USING_STD;530 return atomic_load_explicit((const _Atomic(unsigned char)*)obj,531 memory_order_relaxed);532}533 534static inline short535_Py_atomic_load_short_relaxed(const short *obj)536{537 _Py_USING_STD;538 return atomic_load_explicit((const _Atomic(short)*)obj,539 memory_order_relaxed);540}541 542static inline unsigned short543_Py_atomic_load_ushort_relaxed(const unsigned short *obj)544{545 _Py_USING_STD;546 return atomic_load_explicit((const _Atomic(unsigned short)*)obj,547 memory_order_relaxed);548}549 550static inline long551_Py_atomic_load_long_relaxed(const long *obj)552{553 _Py_USING_STD;554 return atomic_load_explicit((const _Atomic(long)*)obj,555 memory_order_relaxed);556}557 558static inline float559_Py_atomic_load_float_relaxed(const float *obj)560{561 _Py_USING_STD;562 return atomic_load_explicit((const _Atomic(float)*)obj,563 memory_order_relaxed);564}565 566static inline double567_Py_atomic_load_double_relaxed(const double *obj)568{569 _Py_USING_STD;570 return atomic_load_explicit((const _Atomic(double)*)obj,571 memory_order_relaxed);572}573 574static inline int8_t575_Py_atomic_load_int8_relaxed(const int8_t *obj)576{577 _Py_USING_STD;578 return atomic_load_explicit((const _Atomic(int8_t)*)obj,579 memory_order_relaxed);580}581 582static inline int16_t583_Py_atomic_load_int16_relaxed(const int16_t *obj)584{585 _Py_USING_STD;586 return atomic_load_explicit((const _Atomic(int16_t)*)obj,587 memory_order_relaxed);588}589 590static inline int32_t591_Py_atomic_load_int32_relaxed(const int32_t *obj)592{593 _Py_USING_STD;594 return atomic_load_explicit((const _Atomic(int32_t)*)obj,595 memory_order_relaxed);596}597 598static inline int64_t599_Py_atomic_load_int64_relaxed(const int64_t *obj)600{601 _Py_USING_STD;602 return atomic_load_explicit((const _Atomic(int64_t)*)obj,603 memory_order_relaxed);604}605 606static inline intptr_t607_Py_atomic_load_intptr_relaxed(const intptr_t *obj)608{609 _Py_USING_STD;610 return atomic_load_explicit((const _Atomic(intptr_t)*)obj,611 memory_order_relaxed);612}613 614static inline uint8_t615_Py_atomic_load_uint8_relaxed(const uint8_t *obj)616{617 _Py_USING_STD;618 return atomic_load_explicit((const _Atomic(uint8_t)*)obj,619 memory_order_relaxed);620}621 622static inline uint16_t623_Py_atomic_load_uint16_relaxed(const uint16_t *obj)624{625 _Py_USING_STD;626 return atomic_load_explicit((const _Atomic(uint16_t)*)obj,627 memory_order_relaxed);628}629 630static inline uint32_t631_Py_atomic_load_uint32_relaxed(const uint32_t *obj)632{633 _Py_USING_STD;634 return atomic_load_explicit((const _Atomic(uint32_t)*)obj,635 memory_order_relaxed);636}637 638static inline uint64_t639_Py_atomic_load_uint64_relaxed(const uint64_t *obj)640{641 _Py_USING_STD;642 return atomic_load_explicit((const _Atomic(uint64_t)*)obj,643 memory_order_relaxed);644}645 646static inline uintptr_t647_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj)648{649 _Py_USING_STD;650 return atomic_load_explicit((const _Atomic(uintptr_t)*)obj,651 memory_order_relaxed);652}653 654static inline unsigned int655_Py_atomic_load_uint_relaxed(const unsigned int *obj)656{657 _Py_USING_STD;658 return atomic_load_explicit((const _Atomic(unsigned int)*)obj,659 memory_order_relaxed);660}661 662static inline Py_ssize_t663_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj)664{665 _Py_USING_STD;666 return atomic_load_explicit((const _Atomic(Py_ssize_t)*)obj,667 memory_order_relaxed);668}669 670static inline void*671_Py_atomic_load_ptr_relaxed(const void *obj)672{673 _Py_USING_STD;674 return atomic_load_explicit((const _Atomic(void*)*)obj,675 memory_order_relaxed);676}677 678static inline unsigned long long679_Py_atomic_load_ullong_relaxed(const unsigned long long *obj)680{681 _Py_USING_STD;682 return atomic_load_explicit((const _Atomic(unsigned long long)*)obj,683 memory_order_relaxed);684}685 686static inline long long687_Py_atomic_load_llong_relaxed(const long long *obj)688{689 _Py_USING_STD;690 return atomic_load_explicit((const _Atomic(long long)*)obj,691 memory_order_relaxed);692}693 694 695// --- _Py_atomic_store ------------------------------------------------------696 697static inline void698_Py_atomic_store_int(int *obj, int value)699{700 _Py_USING_STD;701 atomic_store((_Atomic(int)*)obj, value);702}703 704static inline void705_Py_atomic_store_int8(int8_t *obj, int8_t value)706{707 _Py_USING_STD;708 atomic_store((_Atomic(int8_t)*)obj, value);709}710 711static inline void712_Py_atomic_store_int16(int16_t *obj, int16_t value)713{714 _Py_USING_STD;715 atomic_store((_Atomic(int16_t)*)obj, value);716}717 718static inline void719_Py_atomic_store_int32(int32_t *obj, int32_t value)720{721 _Py_USING_STD;722 atomic_store((_Atomic(int32_t)*)obj, value);723}724 725static inline void726_Py_atomic_store_int64(int64_t *obj, int64_t value)727{728 _Py_USING_STD;729 atomic_store((_Atomic(int64_t)*)obj, value);730}731 732static inline void733_Py_atomic_store_intptr(intptr_t *obj, intptr_t value)734{735 _Py_USING_STD;736 atomic_store((_Atomic(intptr_t)*)obj, value);737}738 739static inline void740_Py_atomic_store_uint8(uint8_t *obj, uint8_t value)741{742 _Py_USING_STD;743 atomic_store((_Atomic(uint8_t)*)obj, value);744}745 746static inline void747_Py_atomic_store_uint16(uint16_t *obj, uint16_t value)748{749 _Py_USING_STD;750 atomic_store((_Atomic(uint16_t)*)obj, value);751}752 753static inline void754_Py_atomic_store_uint32(uint32_t *obj, uint32_t value)755{756 _Py_USING_STD;757 atomic_store((_Atomic(uint32_t)*)obj, value);758}759 760static inline void761_Py_atomic_store_uint64(uint64_t *obj, uint64_t value)762{763 _Py_USING_STD;764 atomic_store((_Atomic(uint64_t)*)obj, value);765}766 767static inline void768_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value)769{770 _Py_USING_STD;771 atomic_store((_Atomic(uintptr_t)*)obj, value);772}773 774static inline void775_Py_atomic_store_uint(unsigned int *obj, unsigned int value)776{777 _Py_USING_STD;778 atomic_store((_Atomic(unsigned int)*)obj, value);779}780 781static inline void782_Py_atomic_store_ptr(void *obj, void *value)783{784 _Py_USING_STD;785 atomic_store((_Atomic(void*)*)obj, value);786}787 788static inline void789_Py_atomic_store_ssize(Py_ssize_t *obj, Py_ssize_t value)790{791 _Py_USING_STD;792 atomic_store((_Atomic(Py_ssize_t)*)obj, value);793}794 795 796// --- _Py_atomic_store_relaxed ----------------------------------------------797 798static inline void799_Py_atomic_store_int_relaxed(int *obj, int value)800{801 _Py_USING_STD;802 atomic_store_explicit((_Atomic(int)*)obj, value,803 memory_order_relaxed);804}805 806static inline void807_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value)808{809 _Py_USING_STD;810 atomic_store_explicit((_Atomic(int8_t)*)obj, value,811 memory_order_relaxed);812}813 814static inline void815_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value)816{817 _Py_USING_STD;818 atomic_store_explicit((_Atomic(int16_t)*)obj, value,819 memory_order_relaxed);820}821 822static inline void823_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value)824{825 _Py_USING_STD;826 atomic_store_explicit((_Atomic(int32_t)*)obj, value,827 memory_order_relaxed);828}829 830static inline void831_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value)832{833 _Py_USING_STD;834 atomic_store_explicit((_Atomic(int64_t)*)obj, value,835 memory_order_relaxed);836}837 838static inline void839_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value)840{841 _Py_USING_STD;842 atomic_store_explicit((_Atomic(intptr_t)*)obj, value,843 memory_order_relaxed);844}845 846static inline void847_Py_atomic_store_uint8_relaxed(uint8_t *obj, uint8_t value)848{849 _Py_USING_STD;850 atomic_store_explicit((_Atomic(uint8_t)*)obj, value,851 memory_order_relaxed);852}853 854static inline void855_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value)856{857 _Py_USING_STD;858 atomic_store_explicit((_Atomic(uint16_t)*)obj, value,859 memory_order_relaxed);860}861 862static inline void863_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value)864{865 _Py_USING_STD;866 atomic_store_explicit((_Atomic(uint32_t)*)obj, value,867 memory_order_relaxed);868}869 870static inline void871_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value)872{873 _Py_USING_STD;874 atomic_store_explicit((_Atomic(uint64_t)*)obj, value,875 memory_order_relaxed);876}877 878static inline void879_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value)880{881 _Py_USING_STD;882 atomic_store_explicit((_Atomic(uintptr_t)*)obj, value,883 memory_order_relaxed);884}885 886static inline void887_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value)888{889 _Py_USING_STD;890 atomic_store_explicit((_Atomic(unsigned int)*)obj, value,891 memory_order_relaxed);892}893 894static inline void895_Py_atomic_store_ptr_relaxed(void *obj, void *value)896{897 _Py_USING_STD;898 atomic_store_explicit((_Atomic(void*)*)obj, value,899 memory_order_relaxed);900}901 902static inline void903_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value)904{905 _Py_USING_STD;906 atomic_store_explicit((_Atomic(Py_ssize_t)*)obj, value,907 memory_order_relaxed);908}909 910static inline void911_Py_atomic_store_ullong_relaxed(unsigned long long *obj,912 unsigned long long value)913{914 _Py_USING_STD;915 atomic_store_explicit((_Atomic(unsigned long long)*)obj, value,916 memory_order_relaxed);917}918 919static inline void920_Py_atomic_store_char_relaxed(char *obj, char value)921{922 _Py_USING_STD;923 atomic_store_explicit((_Atomic(char)*)obj, value,924 memory_order_relaxed);925}926 927static inline void928_Py_atomic_store_uchar_relaxed(unsigned char *obj, unsigned char value)929{930 _Py_USING_STD;931 atomic_store_explicit((_Atomic(unsigned char)*)obj, value,932 memory_order_relaxed);933}934 935static inline void936_Py_atomic_store_short_relaxed(short *obj, short value)937{938 _Py_USING_STD;939 atomic_store_explicit((_Atomic(short)*)obj, value,940 memory_order_relaxed);941}942 943static inline void944_Py_atomic_store_ushort_relaxed(unsigned short *obj, unsigned short value)945{946 _Py_USING_STD;947 atomic_store_explicit((_Atomic(unsigned short)*)obj, value,948 memory_order_relaxed);949}950 951static inline void952_Py_atomic_store_long_relaxed(long *obj, long value)953{954 _Py_USING_STD;955 atomic_store_explicit((_Atomic(long)*)obj, value,956 memory_order_relaxed);957}958 959static inline void960_Py_atomic_store_float_relaxed(float *obj, float value)961{962 _Py_USING_STD;963 atomic_store_explicit((_Atomic(float)*)obj, value,964 memory_order_relaxed);965}966 967static inline void968_Py_atomic_store_double_relaxed(double *obj, double value)969{970 _Py_USING_STD;971 atomic_store_explicit((_Atomic(double)*)obj, value,972 memory_order_relaxed);973}974 975static inline void976_Py_atomic_store_llong_relaxed(long long *obj, long long value)977{978 _Py_USING_STD;979 atomic_store_explicit((_Atomic(long long)*)obj, value,980 memory_order_relaxed);981}982 983 984// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------985 986static inline void *987_Py_atomic_load_ptr_acquire(const void *obj)988{989 _Py_USING_STD;990 return atomic_load_explicit((const _Atomic(void*)*)obj,991 memory_order_acquire);992}993 994static inline uintptr_t995_Py_atomic_load_uintptr_acquire(const uintptr_t *obj)996{997 _Py_USING_STD;998 return atomic_load_explicit((const _Atomic(uintptr_t)*)obj,999 memory_order_acquire);1000}1001 1002static inline void1003_Py_atomic_store_ptr_release(void *obj, void *value)1004{1005 _Py_USING_STD;1006 atomic_store_explicit((_Atomic(void*)*)obj, value,1007 memory_order_release);1008}1009 1010static inline void1011_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value)1012{1013 _Py_USING_STD;1014 atomic_store_explicit((_Atomic(uintptr_t)*)obj, value,1015 memory_order_release);1016}1017 1018static inline void1019_Py_atomic_store_int_release(int *obj, int value)1020{1021 _Py_USING_STD;1022 atomic_store_explicit((_Atomic(int)*)obj, value,1023 memory_order_release);1024}1025 1026static inline void1027_Py_atomic_store_uint_release(unsigned int *obj, unsigned int value)1028{1029 _Py_USING_STD;1030 atomic_store_explicit((_Atomic(unsigned int)*)obj, value,1031 memory_order_release);1032}1033 1034static inline void1035_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)1036{1037 _Py_USING_STD;1038 atomic_store_explicit((_Atomic(Py_ssize_t)*)obj, value,1039 memory_order_release);1040}1041 1042static inline int1043_Py_atomic_load_int_acquire(const int *obj)1044{1045 _Py_USING_STD;1046 return atomic_load_explicit((const _Atomic(int)*)obj,1047 memory_order_acquire);1048}1049 1050static inline void1051_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value)1052{1053 _Py_USING_STD;1054 atomic_store_explicit((_Atomic(uint32_t)*)obj, value,1055 memory_order_release);1056}1057 1058static inline void1059_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value)1060{1061 _Py_USING_STD;1062 atomic_store_explicit((_Atomic(uint64_t)*)obj, value,1063 memory_order_release);1064}1065 1066static inline uint64_t1067_Py_atomic_load_uint64_acquire(const uint64_t *obj)1068{1069 _Py_USING_STD;1070 return atomic_load_explicit((const _Atomic(uint64_t)*)obj,1071 memory_order_acquire);1072}1073 1074static inline uint32_t1075_Py_atomic_load_uint32_acquire(const uint32_t *obj)1076{1077 _Py_USING_STD;1078 return atomic_load_explicit((const _Atomic(uint32_t)*)obj,1079 memory_order_acquire);1080}1081 1082static inline Py_ssize_t1083_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)1084{1085 _Py_USING_STD;1086 return atomic_load_explicit((const _Atomic(Py_ssize_t)*)obj,1087 memory_order_acquire);1088}1089 1090 1091// --- _Py_atomic_fence ------------------------------------------------------1092 1093 static inline void1094_Py_atomic_fence_seq_cst(void)1095{1096 _Py_USING_STD;1097 atomic_thread_fence(memory_order_seq_cst);1098}1099 1100 static inline void1101_Py_atomic_fence_acquire(void)1102{1103 _Py_USING_STD;1104 atomic_thread_fence(memory_order_acquire);1105}1106 1107 static inline void1108_Py_atomic_fence_release(void)1109{1110 _Py_USING_STD;1111 atomic_thread_fence(memory_order_release);1112}1113 