atomic_ops: Fix MSVC versions of add/sub returning original value instead of result...
authorBastien Montagne <montagne29@wanadoo.fr>
Wed, 1 Jul 2015 10:24:04 +0000 (12:24 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Wed, 1 Jul 2015 10:25:32 +0000 (12:25 +0200)
Thanks to Brecht for tip about how to fix this!

intern/atomic/atomic_ops.h

index 71219e919f1009eea1f28ee2687b547585406d51..d8161d10401bbf1ed4b185d62512876a687e5830 100644 (file)
@@ -123,13 +123,13 @@ atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new)
 ATOMIC_INLINE uint64_t
 atomic_add_uint64(uint64_t *p, uint64_t x)
 {
-       return InterlockedExchangeAdd64((int64_t *)p, (int64_t)x);
+       return InterlockedExchangeAdd64((int64_t *)p, (int64_t)x) + x;
 }
 
 ATOMIC_INLINE uint64_t
 atomic_sub_uint64(uint64_t *p, uint64_t x)
 {
-       return InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x));
+       return InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x)) - x;
 }
 
 ATOMIC_INLINE uint64_t
@@ -268,13 +268,13 @@ atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new)
 ATOMIC_INLINE uint32_t
 atomic_add_uint32(uint32_t *p, uint32_t x)
 {
-       return InterlockedExchangeAdd(p, x);
+       return InterlockedExchangeAdd(p, x) + x;
 }
 
 ATOMIC_INLINE uint32_t
 atomic_sub_uint32(uint32_t *p, uint32_t x)
 {
-       return InterlockedExchangeAdd(p, -((int32_t)x));
+       return InterlockedExchangeAdd(p, -((int32_t)x)) - x;
 }
 
 ATOMIC_INLINE uint32_t