12#ifndef __METAL_GCC_ATOMIC__H__
13#define __METAL_GCC_ATOMIC__H__
32#define ATOMIC_FLAG_INIT 0
33#define ATOMIC_VAR_INIT(VAL) (VAL)
44#define atomic_flag_test_and_set(FLAG) \
45 __sync_lock_test_and_set((FLAG), 1)
46#define atomic_flag_test_and_set_explicit(FLAG, MO) \
47 atomic_flag_test_and_set(FLAG)
48#define atomic_flag_clear(FLAG) \
49 __sync_lock_release((FLAG))
50#define atomic_flag_clear_explicit(FLAG, MO) \
51 atomic_flag_clear(FLAG)
52#define atomic_init(OBJ, VAL) \
53 do { *(OBJ) = (VAL); } while (0)
54#define atomic_is_lock_free(OBJ) \
55 (sizeof(*(OBJ)) <= sizeof(long))
56#define atomic_store(OBJ, VAL) \
57 do { *(OBJ) = (VAL); __sync_synchronize(); } while (0)
58#define atomic_store_explicit(OBJ, VAL, MO) \
59 atomic_store((OBJ), (VAL))
60#define atomic_load(OBJ) \
61 ({ __sync_synchronize(); *(OBJ); })
62#define atomic_load_explicit(OBJ, MO) \
64#define atomic_exchange(OBJ, DES) \
66 __typeof__(OBJ) obj = (OBJ); \
67 __typeof__(*obj) des = (DES); \
68 __typeof__(*obj) expval; \
69 __typeof__(*obj) oldval = atomic_load(obj); \
72 oldval = __sync_val_compare_and_swap( \
74 } while (oldval != expval); \
77#define atomic_exchange_explicit(OBJ, DES, MO) \
78 atomic_exchange((OBJ), (DES))
79#define atomic_compare_exchange_strong(OBJ, EXP, DES) \
81 __typeof__(OBJ) obj = (OBJ); \
82 __typeof__(EXP) exp = (EXP); \
83 __typeof__(*obj) expval = *exp; \
84 __typeof__(*obj) oldval = __sync_val_compare_and_swap( \
85 obj, expval, (DES)); \
89#define atomic_compare_exchange_strong_explicit(OBJ, EXP, DES, MO) \
90 atomic_compare_exchange_strong((OBJ), (EXP), (DES))
91#define atomic_compare_exchange_weak(OBJ, EXP, DES) \
92 atomic_compare_exchange_strong((OBJ), (EXP), (DES))
93#define atomic_compare_exchange_weak_explicit(OBJ, EXP, DES, MO) \
94 atomic_compare_exchange_weak((OBJ), (EXP), (DES))
95#define atomic_fetch_add(OBJ, VAL) \
96 __sync_fetch_and_add((OBJ), (VAL))
97#define atomic_fetch_add_explicit(OBJ, VAL, MO) \
98 atomic_fetch_add((OBJ), (VAL))
99#define atomic_fetch_sub(OBJ, VAL) \
100 __sync_fetch_and_sub((OBJ), (VAL))
101#define atomic_fetch_sub_explicit(OBJ, VAL, MO) \
102 atomic_fetch_sub((OBJ), (VAL))
103#define atomic_fetch_or(OBJ, VAL) \
104 __sync_fetch_and_or((OBJ), (VAL))
105#define atomic_fetch_or_explicit(OBJ, VAL, MO) \
106 atomic_fetch_or((OBJ), (VAL))
107#define atomic_fetch_xor(OBJ, VAL) \
108 __sync_fetch_and_xor((OBJ), (VAL))
109#define atomic_fetch_xor_explicit(OBJ, VAL, MO) \
110 atomic_fetch_xor((OBJ), (VAL))
111#define atomic_fetch_and(OBJ, VAL) \
112 __sync_fetch_and_and((OBJ), (VAL))
113#define atomic_fetch_and_explicit(OBJ, VAL, MO) \
114 atomic_fetch_and((OBJ), (VAL))
115#define atomic_thread_fence(MO) \
117#define atomic_signal_fence(MO) \
memory_order
Definition atomic.h:35
@ memory_order_consume
Definition atomic.h:37
@ memory_order_seq_cst
Definition atomic.h:41
@ memory_order_release
Definition atomic.h:39
@ memory_order_relaxed
Definition atomic.h:36
@ memory_order_acq_rel
Definition atomic.h:40
@ memory_order_acquire
Definition atomic.h:38
unsigned long long atomic_ullong
Definition atomic.h:30
unsigned char atomic_uchar
Definition atomic.h:21
int atomic_int
Definition atomic.h:24
char atomic_char
Definition atomic.h:20
unsigned int atomic_uint
Definition atomic.h:25
short atomic_short
Definition atomic.h:22
unsigned short atomic_ushort
Definition atomic.h:23
long atomic_long
Definition atomic.h:27
unsigned long atomic_ulong
Definition atomic.h:28
int atomic_flag
Definition atomic.h:19
atomic_uint atomic_uintptr_t
Definition atomic.h:26
long long atomic_llong
Definition atomic.h:29