Home | History | Annotate | Line # | Download | only in uatomic
      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