1 #ifndef _URCU_UATOMIC_API_H 2 #define _URCU_UATOMIC_API_H 3 4 /* 5 * Select second argument. Use inside macros to implement optional last macro 6 * argument, such as: 7 * 8 * #define macro(_a, _b, _c, _optional...) \ 9 * _uatomic_select_arg1(_, ##_optional, do_default_macro()) 10 */ 11 #define _uatomic_select_arg1(arg0, arg1, ...) arg1 12 13 /* 14 * Like _uatomic_select_arg2(), but can be used for selecting a second optional 15 * argument. 16 */ 17 #define _uatomic_select_arg2(arg0, arg1, arg2, ...) arg2 18 19 #define _uatomic_default_mo(dflt, mo...) \ 20 _uatomic_select_arg1(_, ##mo, dflt) 21 22 #define _uatomic_default_mo2(dflt, mo...) \ 23 _uatomic_select_arg2(_, ##mo, dflt, dflt) 24 25 #define uatomic_load(addr, mo...) \ 26 uatomic_load_mo(addr, _uatomic_default_mo(CMM_RELAXED, ##mo)) 27 28 #define uatomic_read(addr, mo...) \ 29 uatomic_load_mo(addr, _uatomic_default_mo(CMM_RELAXED, ##mo)) 30 31 #define uatomic_store(addr, value, mo...) \ 32 uatomic_store_mo(addr, value, _uatomic_default_mo(CMM_RELAXED, ##mo)) 33 34 #define uatomic_set(addr, value, mo...) \ 35 uatomic_store_mo(addr, value, _uatomic_default_mo(CMM_RELAXED, ##mo)) 36 37 #define uatomic_add_return(addr, v, mo...) \ 38 uatomic_add_return_mo(addr, v, _uatomic_default_mo(CMM_SEQ_CST_FENCE, ##mo)) 39 40 #define uatomic_sub_return(addr, v, mo...) \ 41 uatomic_sub_return_mo(addr, v, _uatomic_default_mo(CMM_SEQ_CST_FENCE, ##mo)) 42 43 #define uatomic_and(addr, mask, mo...) \ 44 uatomic_and_mo(addr, mask, _uatomic_default_mo(CMM_SEQ_CST, ##mo)) 45 46 #define uatomic_or(addr, mask, mo...) \ 47 uatomic_or_mo(addr, mask, _uatomic_default_mo(CMM_RELAXED, ##mo)) 48 49 #define uatomic_add(addr, v, mo...) \ 50 uatomic_add_mo(addr, v, _uatomic_default_mo(CMM_RELAXED, ##mo)) 51 52 #define uatomic_sub(addr, v, mo...) \ 53 uatomic_sub_mo(addr, v, _uatomic_default_mo(CMM_RELAXED, ##mo)) 54 55 #define uatomic_inc(addr, mo...) \ 56 uatomic_inc_mo(addr, _uatomic_default_mo(CMM_RELAXED, ##mo)) 57 58 #define uatomic_dec(addr, mo...) \ 59 uatomic_dec_mo(addr, _uatomic_default_mo(CMM_RELAXED, ##mo)) 60 61 #define uatomic_xchg(addr, value, mo...) \ 62 uatomic_xchg_mo(addr, value, \ 63 _uatomic_default_mo(CMM_SEQ_CST_FENCE, ##mo)) 64 65 #define uatomic_cmpxchg(addr, value, _new, mo...) \ 66 uatomic_cmpxchg_mo(addr, value, _new, \ 67 _uatomic_default_mo(CMM_SEQ_CST_FENCE, ##mo), \ 68 _uatomic_default_mo2(CMM_RELAXED, ##mo)) 69 70 71 #endif /* _URUC_UATOMIC_API_H */ 72