36 #ifndef __METAL_GCC_ATOMIC__H__ 37 #define __METAL_GCC_ATOMIC__H__ 55 #define ATOMIC_FLAG_INIT 0 56 #define ATOMIC_VAR_INIT(VAL) (VAL) 67 #define atomic_flag_test_and_set(FLAG) \ 68 __sync_lock_test_and_set((FLAG), 1) 69 #define atomic_flag_test_and_set_explicit(FLAG, MO) \ 70 atomic_flag_test_and_set(FLAG) 71 #define atomic_flag_clear(FLAG) \ 72 __sync_lock_release((FLAG)) 73 #define atomic_flag_clear_explicit(FLAG, MO) \ 74 atomic_flag_clear(FLAG) 75 #define atomic_init(OBJ, VAL) \ 76 do { *(OBJ) = (VAL); } while (0) 77 #define atomic_is_lock_free(OBJ) \ 78 (sizeof(*(OBJ)) <= sizeof(long)) 79 #define atomic_store(OBJ, VAL) \ 80 do { *(OBJ) = (VAL); __sync_synchronize(); } while (0) 81 #define atomic_store_explicit(OBJ, VAL, MO) \ 82 atomic_store((OBJ), (VAL)) 83 #define atomic_load(OBJ) \ 84 ({ __sync_synchronize(); *(OBJ); }) 85 #define atomic_load_explicit(OBJ, MO) \ 87 #define atomic_exchange(OBJ, DES) \ 89 typeof(OBJ) obj = (OBJ); \ 90 typeof(*obj) des = (DES); \ 91 typeof(*obj) expval; \ 92 typeof(*obj) oldval = atomic_load(obj); \ 95 oldval = __sync_val_compare_and_swap( \ 97 } while (oldval != expval); \ 100 #define atomic_exchange_explicit(OBJ, DES, MO) \ 101 atomic_exchange((OBJ), (DES)) 102 #define atomic_compare_exchange_strong(OBJ, EXP, DES) \ 104 typeof(OBJ) obj = (OBJ); \ 105 typeof(EXP) exp = (EXP); \ 106 typeof(*obj) expval = *exp; \ 107 typeof(*obj) oldval = __sync_val_compare_and_swap( \ 108 obj, expval, (DES)); \ 112 #define atomic_compare_exchange_strong_explicit(OBJ, EXP, DES, MO) \ 113 atomic_compare_exchange_strong((OBJ), (EXP), (DES)) 114 #define atomic_compare_exchange_weak(OBJ, EXP, DES) \ 115 atomic_compare_exchange_strong((OBJ), (EXP), (DES)) 116 #define atomic_compare_exchange_weak_explicit(OBJ, EXP, DES, MO) \ 117 atomic_compare_exchange_weak((OBJ), (EXP), (DES)) 118 #define atomic_fetch_add(OBJ, VAL) \ 119 __sync_fetch_and_add((OBJ), (VAL)) 120 #define atomic_fetch_add_explicit(OBJ, VAL, MO) \ 121 atomic_fetch_add((OBJ), (VAL)) 122 #define atomic_fetch_sub(OBJ, VAL) \ 123 __sync_fetch_and_sub((OBJ), (VAL)) 124 #define atomic_fetch_sub_explicit(OBJ, VAL, MO) \ 125 atomic_fetch_sub((OBJ), (VAL)) 126 #define atomic_fetch_or(OBJ, VAL) \ 127 __sync_fetch_and_or((OBJ), (VAL)) 128 #define atomic_fetch_or_explicit(OBJ, VAL, MO) \ 129 atomic_fetch_or((OBJ), (VAL)) 130 #define atomic_fetch_xor(OBJ, VAL) \ 131 __sync_fetch_and_xor((OBJ), (VAL)) 132 #define atomic_fetch_xor_explicit(OBJ, VAL, MO) \ 133 atomic_fetch_xor((OBJ), (VAL)) 134 #define atomic_fetch_and(OBJ, VAL) \ 135 __sync_fetch_and_and((OBJ), (VAL)) 136 #define atomic_fetch_and_explicit(OBJ, VAL, MO) \ 137 atomic_fetch_and((OBJ), (VAL)) 138 #define atomic_thread_fence(MO) \ 140 #define atomic_signal_fence(MO) \ unsigned short atomic_ushort
Definition: atomic.h:47
long atomic_long
Definition: atomic.h:50
memory_order
Definition: atomic.h:58
short atomic_short
Definition: atomic.h:46
char atomic_char
Definition: atomic.h:44
unsigned char atomic_uchar
Definition: atomic.h:45
unsigned long atomic_ulong
Definition: atomic.h:51
long long atomic_llong
Definition: atomic.h:52
unsigned long long atomic_ullong
Definition: atomic.h:53
unsigned int atomic_uint
Definition: atomic.h:49
int atomic_flag
Definition: atomic.h:43
int atomic_int
Definition: atomic.h:48