12 #define SPA_ATOMIC_CAS(v,ov,nv) \ 14 __typeof__(v) __ov = (ov); \ 15 __atomic_compare_exchange_n(&(v), &__ov, (nv), \ 16 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ 19 #define SPA_ATOMIC_DEC(s) __atomic_sub_fetch(&(s), 1, __ATOMIC_SEQ_CST) 20 #define SPA_ATOMIC_INC(s) __atomic_add_fetch(&(s), 1, __ATOMIC_SEQ_CST) 21 #define SPA_ATOMIC_LOAD(s) __atomic_load_n(&(s), __ATOMIC_SEQ_CST) 22 #define SPA_ATOMIC_STORE(s,v) __atomic_store_n(&(s), (v), __ATOMIC_SEQ_CST) 23 #define SPA_ATOMIC_XCHG(s,v) __atomic_exchange_n(&(s), (v), __ATOMIC_SEQ_CST) 25 #define SPA_SEQ_WRITE(s) SPA_ATOMIC_INC(s) 26 #define SPA_SEQ_WRITE_SUCCESS(s1,s2) ((s1) + 1 == (s2) && ((s2) & 1) == 0) 28 #define SPA_SEQ_READ(s) SPA_ATOMIC_LOAD(s) 29 #define SPA_SEQ_READ_SUCCESS(s1,s2) ((s1) == (s2) && ((s2) & 1) == 0)