X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fuatomic%2Fgeneric.h;h=37f59cc11429229ce0dc19aa17a746b03f458cb7;hp=82b7c8c5eb38055e5cdf845be429647dfd63fa27;hb=13e0bc720bc9baadf0adc007f0035c180888b1f1;hpb=ef6ca0226ee82ef2f0b2d9a60c646019e20a5fa4 diff --git a/urcu/uatomic/generic.h b/urcu/uatomic/generic.h index 82b7c8c..37f59cc 100644 --- a/urcu/uatomic/generic.h +++ b/urcu/uatomic/generic.h @@ -29,7 +29,7 @@ extern "C" { #endif #ifndef uatomic_set -#define uatomic_set(addr, v) CMM_STORE_SHARED(*(addr), (v)) +#define uatomic_set(addr, v) ((void) CMM_STORE_SHARED(*(addr), (v))) #endif #ifndef uatomic_read @@ -38,19 +38,21 @@ extern "C" { #if !defined __OPTIMIZE__ || defined UATOMIC_NO_LINK_ERROR static inline __attribute__((always_inline)) -void _uatomic_link_error() +void _uatomic_link_error(void) { #ifdef ILLEGAL_INSTR - /* generate an illegal instruction. Cannot catch this with linker tricks - * when optimizations are disabled. */ + /* + * generate an illegal instruction. Cannot catch this with + * linker tricks when optimizations are disabled. + */ __asm__ __volatile__(ILLEGAL_INSTR); #else - __builtin_trap (); + __builtin_trap(); #endif } #else /* #if !defined __OPTIMIZE__ || defined UATOMIC_NO_LINK_ERROR */ -extern void _uatomic_link_error (); +extern void _uatomic_link_error(void); #endif /* #else #if !defined __OPTIMIZE__ || defined UATOMIC_NO_LINK_ERROR */ /* cmpxchg */ @@ -81,9 +83,10 @@ unsigned long _uatomic_cmpxchg(void *addr, unsigned long old, } -#define uatomic_cmpxchg(addr, old, _new) \ - ((__typeof__(*(addr))) _uatomic_cmpxchg((addr), (unsigned long)(old),\ - (unsigned long)(_new), \ +#define uatomic_cmpxchg(addr, old, _new) \ + ((__typeof__(*(addr))) _uatomic_cmpxchg((addr), \ + caa_cast_long_keep_sign(old), \ + caa_cast_long_keep_sign(_new),\ sizeof(*(addr)))) @@ -98,26 +101,32 @@ void _uatomic_and(void *addr, unsigned long val, #ifdef UATOMIC_HAS_ATOMIC_BYTE case 1: __sync_and_and_fetch_1(addr, val); + return; #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT case 2: __sync_and_and_fetch_2(addr, val); + return; #endif case 4: __sync_and_and_fetch_4(addr, val); + return; #if (CAA_BITS_PER_LONG == 64) case 8: __sync_and_and_fetch_8(addr, val); + return; #endif } _uatomic_link_error(); - return 0; } #define uatomic_and(addr, v) \ (_uatomic_and((addr), \ - (unsigned long)(v), \ - sizeof(*(addr)))) + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) +#define cmm_smp_mb__before_uatomic_and() cmm_barrier() +#define cmm_smp_mb__after_uatomic_and() cmm_barrier() + #endif /* uatomic_or */ @@ -131,28 +140,36 @@ void _uatomic_or(void *addr, unsigned long val, #ifdef UATOMIC_HAS_ATOMIC_BYTE case 1: __sync_or_and_fetch_1(addr, val); + return; #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT case 2: __sync_or_and_fetch_2(addr, val); + return; #endif case 4: __sync_or_and_fetch_4(addr, val); + return; #if (CAA_BITS_PER_LONG == 64) case 8: __sync_or_and_fetch_8(addr, val); + return; #endif } _uatomic_link_error(); - return 0; + return; } #define uatomic_or(addr, v) \ (_uatomic_or((addr), \ - (unsigned long)(v), \ - sizeof(*(addr)))) + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) +#define cmm_smp_mb__before_uatomic_or() cmm_barrier() +#define cmm_smp_mb__after_uatomic_or() cmm_barrier() + #endif + /* uatomic_add_return */ #ifndef uatomic_add_return @@ -181,10 +198,10 @@ unsigned long _uatomic_add_return(void *addr, unsigned long val, } -#define uatomic_add_return(addr, v) \ - ((__typeof__(*(addr))) _uatomic_add_return((addr), \ - (unsigned long)(v), \ - sizeof(*(addr)))) +#define uatomic_add_return(addr, v) \ + ((__typeof__(*(addr))) _uatomic_add_return((addr), \ + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) #endif /* #ifndef uatomic_add_return */ #ifndef uatomic_xchg @@ -246,7 +263,8 @@ unsigned long _uatomic_exchange(void *addr, unsigned long val, int len) } #define uatomic_xchg(addr, v) \ - ((__typeof__(*(addr))) _uatomic_exchange((addr), (unsigned long)(v), \ + ((__typeof__(*(addr))) _uatomic_exchange((addr), \ + caa_cast_long_keep_sign(v), \ sizeof(*(addr)))) #endif /* #ifndef uatomic_xchg */ @@ -315,10 +333,13 @@ void _uatomic_and(void *addr, unsigned long val, int len) _uatomic_link_error(); } -#define uatomic_and(addr, v) \ - (_uatomic_and((addr), \ - (unsigned long)(v), \ - sizeof(*(addr)))) +#define uatomic_and(addr, v) \ + (_uatomic_and((addr), \ + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) +#define cmm_smp_mb__before_uatomic_and() cmm_barrier() +#define cmm_smp_mb__after_uatomic_and() cmm_barrier() + #endif /* #ifndef uatomic_and */ #ifndef uatomic_or @@ -386,10 +407,13 @@ void _uatomic_or(void *addr, unsigned long val, int len) _uatomic_link_error(); } -#define uatomic_or(addr, v) \ - (_uatomic_or((addr), \ - (unsigned long)(v),\ - sizeof(*(addr)))) +#define uatomic_or(addr, v) \ + (_uatomic_or((addr), \ + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) +#define cmm_smp_mb__before_uatomic_or() cmm_barrier() +#define cmm_smp_mb__after_uatomic_or() cmm_barrier() + #endif /* #ifndef uatomic_or */ #ifndef uatomic_add_return @@ -462,10 +486,10 @@ unsigned long _uatomic_add_return(void *addr, unsigned long val, int len) return 0; } -#define uatomic_add_return(addr, v) \ - ((__typeof__(*(addr))) _uatomic_add_return((addr), \ - (unsigned long)(v), \ - sizeof(*(addr)))) +#define uatomic_add_return(addr, v) \ + ((__typeof__(*(addr))) _uatomic_add_return((addr), \ + caa_cast_long_keep_sign(v), \ + sizeof(*(addr)))) #endif /* #ifndef uatomic_add_return */ #ifndef uatomic_xchg @@ -539,7 +563,8 @@ unsigned long _uatomic_exchange(void *addr, unsigned long val, int len) } #define uatomic_xchg(addr, v) \ - ((__typeof__(*(addr))) _uatomic_exchange((addr), (unsigned long)(v), \ + ((__typeof__(*(addr))) _uatomic_exchange((addr), \ + caa_cast_long_keep_sign(v), \ sizeof(*(addr)))) #endif /* #ifndef uatomic_xchg */ @@ -549,17 +574,27 @@ unsigned long _uatomic_exchange(void *addr, unsigned long val, int len) #ifndef uatomic_add #define uatomic_add(addr, v) (void)uatomic_add_return((addr), (v)) +#define cmm_smp_mb__before_uatomic_add() cmm_barrier() +#define cmm_smp_mb__after_uatomic_add() cmm_barrier() #endif -#define uatomic_sub_return(addr, v) uatomic_add_return((addr), -(v)) -#define uatomic_sub(addr, v) uatomic_add((addr), -(v)) +#define uatomic_sub_return(addr, v) \ + uatomic_add_return((addr), -(caa_cast_long_keep_sign(v))) +#define uatomic_sub(addr, v) \ + uatomic_add((addr), -(caa_cast_long_keep_sign(v))) +#define cmm_smp_mb__before_uatomic_sub() cmm_smp_mb__before_uatomic_add() +#define cmm_smp_mb__after_uatomic_sub() cmm_smp_mb__after_uatomic_add() #ifndef uatomic_inc #define uatomic_inc(addr) uatomic_add((addr), 1) +#define cmm_smp_mb__before_uatomic_inc() cmm_smp_mb__before_uatomic_add() +#define cmm_smp_mb__after_uatomic_inc() cmm_smp_mb__after_uatomic_add() #endif #ifndef uatomic_dec #define uatomic_dec(addr) uatomic_add((addr), -1) +#define cmm_smp_mb__before_uatomic_dec() cmm_smp_mb__before_uatomic_add() +#define cmm_smp_mb__after_uatomic_dec() cmm_smp_mb__after_uatomic_add() #endif #ifdef __cplusplus