[Bf-blender-cvs] [fa9bb2f] master: Atomic ops: Fix atomic_add_uint32 and atomic_sub_uint32 in Windows

Benoit Bolsee noreply at git.blender.org
Sat Jun 11 22:24:10 CEST 2016


Commit: fa9bb2ffe97334a5c686b954673af118c41d1a6d
Author: Benoit Bolsee
Date:   Fri Jun 10 00:00:33 2016 +0200
Branches: master
https://developer.blender.org/rBfa9bb2ffe97334a5c686b954673af118c41d1a6d

Atomic ops: Fix atomic_add_uint32 and atomic_sub_uint32 in Windows

    The assembler version in Windows used to return the previous value
    of the variable while all the other versions return the new value.
    This is now fixed for consistency.
    Note: this bug had no effect on blender because no part of the code
    use the return value of these functions, but the future BGE DeckLink
    module makes use of it to implement reference counter.

===================================================================

M	intern/atomic/intern/atomic_ops_unix.h

===================================================================

diff --git a/intern/atomic/intern/atomic_ops_unix.h b/intern/atomic/intern/atomic_ops_unix.h
index bf54750..55c0002 100644
--- a/intern/atomic/intern/atomic_ops_unix.h
+++ b/intern/atomic/intern/atomic_ops_unix.h
@@ -129,23 +129,24 @@ ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _ne
 #elif (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
 ATOMIC_INLINE uint32_t atomic_add_uint32(uint32_t *p, uint32_t x)
 {
+	uint32_t ret = x;
 	asm volatile (
 	    "lock; xaddl %0, %1;"
-	    : "+r" (x), "=m" (*p) /* Outputs. */
+	    : "+r" (ret), "=m" (*p) /* Outputs. */
 	    : "m" (*p) /* Inputs. */
 	    );
-	return x;
+	return ret+x;
 }
 
 ATOMIC_INLINE uint32_t atomic_sub_uint32(uint32_t *p, uint32_t x)
 {
-	x = (uint32_t)(-(int32_t)x);
+	ret = (uint32_t)(-(int32_t)x);
 	asm volatile (
 	    "lock; xaddl %0, %1;"
-	    : "+r" (x), "=m" (*p) /* Outputs. */
+	    : "+r" (ret), "=m" (*p) /* Outputs. */
 	    : "m" (*p) /* Inputs. */
 	    );
-	return x;
+	return ret-x;
 }
 
 ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new)




More information about the Bf-blender-cvs mailing list