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