16#ifndef INSIDE_ATOMICS_H
17# error "should be included via atomics.h"
24#if !defined(pg_read_barrier_impl)
25# define pg_read_barrier_impl pg_memory_barrier_impl
27#if !defined(pg_write_barrier_impl)
28# define pg_write_barrier_impl pg_memory_barrier_impl
32#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && defined(PG_HAVE_ATOMIC_U32_SUPPORT)
33#define PG_HAVE_ATOMIC_FLAG_SUPPORT
37#ifndef PG_HAVE_ATOMIC_READ_U32
38#define PG_HAVE_ATOMIC_READ_U32
46#ifndef PG_HAVE_ATOMIC_WRITE_U32
47#define PG_HAVE_ATOMIC_WRITE_U32
55#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
56#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
67#if !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
69#define PG_HAVE_ATOMIC_INIT_FLAG
76#define PG_HAVE_ATOMIC_TEST_SET_FLAG
83#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
91#define PG_HAVE_ATOMIC_CLEAR_FLAG
104#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
106#define PG_HAVE_ATOMIC_INIT_FLAG
113#define PG_HAVE_ATOMIC_TEST_SET_FLAG
121#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
128#define PG_HAVE_ATOMIC_CLEAR_FLAG
137#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG)
138# error "No pg_atomic_test_and_set provided"
142#ifndef PG_HAVE_ATOMIC_INIT_U32
143#define PG_HAVE_ATOMIC_INIT_U32
151#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
152#define PG_HAVE_ATOMIC_EXCHANGE_U32
164#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
165#define PG_HAVE_ATOMIC_FETCH_ADD_U32
177#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
178#define PG_HAVE_ATOMIC_FETCH_SUB_U32
186#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
187#define PG_HAVE_ATOMIC_FETCH_AND_U32
199#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
200#define PG_HAVE_ATOMIC_FETCH_OR_U32
212#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
213#define PG_HAVE_ATOMIC_ADD_FETCH_U32
221#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32)
222#define PG_HAVE_ATOMIC_SUB_FETCH_U32
230#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
231#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32
239#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
240#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32
248#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
249#define PG_HAVE_ATOMIC_EXCHANGE_U64
261#ifndef PG_HAVE_ATOMIC_WRITE_U64
262#define PG_HAVE_ATOMIC_WRITE_U64
264#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
265 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
294#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64
295#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64
303#ifndef PG_HAVE_ATOMIC_READ_U64
304#define PG_HAVE_ATOMIC_READ_U64
306#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
307 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
339#ifndef PG_HAVE_ATOMIC_INIT_U64
340#define PG_HAVE_ATOMIC_INIT_U64
348#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
349#define PG_HAVE_ATOMIC_FETCH_ADD_U64
361#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
362#define PG_HAVE_ATOMIC_FETCH_SUB_U64
370#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
371#define PG_HAVE_ATOMIC_FETCH_AND_U64
383#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
384#define PG_HAVE_ATOMIC_FETCH_OR_U64
396#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
397#define PG_HAVE_ATOMIC_ADD_FETCH_U64
405#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U64)
406#define PG_HAVE_ATOMIC_SUB_FETCH_U64
414#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
415#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64
423#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64)
424#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_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)
#define pg_memory_barrier_impl()
static uint32 pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
static void pg_atomic_unlocked_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
static uint64 pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
static void pg_atomic_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
static void pg_atomic_unlocked_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
static void pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)
static void pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
static uint32 pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)
static void pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)