X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Fuatomic%2Fgeneric.h;h=04f4afd715800dd02446183d183c4f896de142c1;hb=e56d99bf2046a163875df80bab5195f38606dfde;hp=337fe4098bf8337649f9a6bb52af4f9359453091;hpb=a2e7bf9ce5de5113c7f59c380b0087e291cd603d;p=urcu.git diff --git a/urcu/uatomic/generic.h b/urcu/uatomic/generic.h index 337fe40..04f4afd 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)))) @@ -98,26 +99,29 @@ 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)))) #endif /* uatomic_or */ @@ -131,26 +135,30 @@ 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)))) #endif /* uatomic_add_return */ @@ -181,10 +189,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 +254,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 */ @@ -269,6 +278,8 @@ void _uatomic_and(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old & val, 1); } while (oldt != old); + + return; } #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT @@ -292,6 +303,8 @@ void _uatomic_and(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old & val, 4); } while (oldt != old); + + return; } #if (CAA_BITS_PER_LONG == 64) case 8: @@ -303,17 +316,18 @@ void _uatomic_and(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old & val, 8); } while (oldt != old); + + return; } #endif } _uatomic_link_error(); - return 0; } -#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)))) #endif /* #ifndef uatomic_and */ #ifndef uatomic_or @@ -333,6 +347,8 @@ void _uatomic_or(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old | val, 1); } while (oldt != old); + + return; } #endif #ifdef UATOMIC_HAS_ATOMIC_SHORT @@ -345,6 +361,8 @@ void _uatomic_or(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old | val, 2); } while (oldt != old); + + return; } #endif case 4: @@ -356,6 +374,8 @@ void _uatomic_or(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old | val, 4); } while (oldt != old); + + return; } #if (CAA_BITS_PER_LONG == 64) case 8: @@ -367,17 +387,18 @@ void _uatomic_or(void *addr, unsigned long val, int len) old = oldt; oldt = _uatomic_cmpxchg(addr, old, old | val, 8); } while (oldt != old); + + return; } #endif } _uatomic_link_error(); - return 0; } -#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)))) #endif /* #ifndef uatomic_or */ #ifndef uatomic_add_return @@ -450,10 +471,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 @@ -527,7 +548,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 */ @@ -539,8 +561,10 @@ unsigned long _uatomic_exchange(void *addr, unsigned long val, int len) #define uatomic_add(addr, v) (void)uatomic_add_return((addr), (v)) #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))) #ifndef uatomic_inc #define uatomic_inc(addr) uatomic_add((addr), 1)