23#ifndef INSIDE_ATOMICS_H
24#error "should be included via atomics.h"
30#define pg_compiler_barrier_impl() __asm__ __volatile__("" ::: "memory")
37#if !defined(pg_memory_barrier_impl)
38# if defined(HAVE_GCC__ATOMIC_INT32_CAS)
39# define pg_memory_barrier_impl() __atomic_thread_fence(__ATOMIC_SEQ_CST)
40# elif defined(__GNUC__)
41# define pg_memory_barrier_impl() __sync_synchronize()
45#if !defined(pg_read_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
47# define pg_read_barrier_impl() do \
49 pg_compiler_barrier_impl(); \
50 __atomic_thread_fence(__ATOMIC_ACQUIRE); \
54#if !defined(pg_write_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
56# define pg_write_barrier_impl() do \
58 pg_compiler_barrier_impl(); \
59 __atomic_thread_fence(__ATOMIC_RELEASE); \
65#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) \
66 && (defined(HAVE_GCC__SYNC_INT32_TAS) || defined(HAVE_GCC__SYNC_CHAR_TAS))
68#define PG_HAVE_ATOMIC_FLAG_SUPPORT
76#ifdef HAVE_GCC__SYNC_INT32_TAS
86#if !defined(PG_HAVE_ATOMIC_U32_SUPPORT) \
87 && (defined(HAVE_GCC__ATOMIC_INT32_CAS) || defined(HAVE_GCC__SYNC_INT32_CAS))
89#define PG_HAVE_ATOMIC_U32_SUPPORT
98#if !defined(PG_HAVE_ATOMIC_U64_SUPPORT) \
99 && !defined(PG_DISABLE_64_BIT_ATOMICS) \
100 && (defined(HAVE_GCC__ATOMIC_INT64_CAS) || defined(HAVE_GCC__SYNC_INT64_CAS))
102#define PG_HAVE_ATOMIC_U64_SUPPORT
110#ifdef PG_HAVE_ATOMIC_FLAG_SUPPORT
112#if defined(HAVE_GCC__SYNC_CHAR_TAS) || defined(HAVE_GCC__SYNC_INT32_TAS)
114#ifndef PG_HAVE_ATOMIC_TEST_SET_FLAG
115#define PG_HAVE_ATOMIC_TEST_SET_FLAG
127#ifndef PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
128#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
132 return ptr->value == 0;
136#ifndef PG_HAVE_ATOMIC_CLEAR_FLAG
137#define PG_HAVE_ATOMIC_CLEAR_FLAG
145#ifndef PG_HAVE_ATOMIC_INIT_FLAG
146#define PG_HAVE_ATOMIC_INIT_FLAG
157#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
158#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
169#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
170#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
192#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
193#define PG_HAVE_ATOMIC_EXCHANGE_U32
203#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
204#define PG_HAVE_ATOMIC_FETCH_ADD_U32
212#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
213#define PG_HAVE_ATOMIC_FETCH_SUB_U32
221#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
222#define PG_HAVE_ATOMIC_FETCH_AND_U32
230#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
231#define PG_HAVE_ATOMIC_FETCH_OR_U32
240#if !defined(PG_DISABLE_64_BIT_ATOMICS)
242#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS)
243#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
254#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
255#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
279#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS)
280#define PG_HAVE_ATOMIC_EXCHANGE_U64
290#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
291#define PG_HAVE_ATOMIC_FETCH_ADD_U64
299#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
300#define PG_HAVE_ATOMIC_FETCH_SUB_U64
308#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
309#define PG_HAVE_ATOMIC_FETCH_AND_U64
317#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
318#define PG_HAVE_ATOMIC_FETCH_OR_U64
static bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
static uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
#define AssertPointerAlignment(ptr, bndr)
static uint32 pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)