X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Fuatomic%2Fgeneric.h;h=4ef71c77604eb4b96ba7913b4268aef6a3618250;hb=2812a2d2cfdfeea621768de1a0216bc1549a4902;hp=bf7cc6aa05172b5072368ae381d60fc1aa31a6d3;hpb=92cfe223501f564d3bd726a6c580702daeef4198;p=urcu.git diff --git a/urcu/uatomic/generic.h b/urcu/uatomic/generic.h index bf7cc6a..4ef71c7 100644 --- a/urcu/uatomic/generic.h +++ b/urcu/uatomic/generic.h @@ -81,9 +81,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)))) @@ -119,8 +120,11 @@ void _uatomic_and(void *addr, unsigned long val, #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_and() cmm_barrier() +#define cmm_smp_mb__after_and() cmm_barrier() + #endif /* uatomic_or */ @@ -156,10 +160,14 @@ void _uatomic_or(void *addr, unsigned long val, #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_or() cmm_barrier() +#define cmm_smp_mb__after_or() cmm_barrier() + #endif + /* uatomic_add_return */ #ifndef uatomic_add_return @@ -188,10 +196,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 @@ -253,7 +261,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 */ @@ -322,10 +331,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_and() cmm_barrier() +#define cmm_smp_mb__after_and() cmm_barrier() + #endif /* #ifndef uatomic_and */ #ifndef uatomic_or @@ -393,10 +405,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_or() cmm_barrier() +#define cmm_smp_mb__after_or() cmm_barrier() + #endif /* #ifndef uatomic_or */ #ifndef uatomic_add_return @@ -469,10 +484,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 @@ -546,7 +561,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 */ @@ -556,17 +572,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_add() cmm_barrier() +#define cmm_smp_mb__after_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_sub() cmm_smp_mb__before_add() +#define cmm_smp_mb__after_sub() cmm_smp_mb__after_add() #ifndef uatomic_inc #define uatomic_inc(addr) uatomic_add((addr), 1) +#define cmm_smp_mb__before_inc() cmm_smp_mb__before_add() +#define cmm_smp_mb__after_inc() cmm_smp_mb__after_add() #endif #ifndef uatomic_dec #define uatomic_dec(addr) uatomic_add((addr), -1) +#define cmm_smp_mb__before_dec() cmm_smp_mb__before_add() +#define cmm_smp_mb__after_dec() cmm_smp_mb__after_add() #endif #ifdef __cplusplus