diff options
Diffstat (limited to 'intern/atomic/atomic_ops.h')
-rw-r--r-- | intern/atomic/atomic_ops.h | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/intern/atomic/atomic_ops.h b/intern/atomic/atomic_ops.h index f63ff630c40..d8161d10401 100644 --- a/intern/atomic/atomic_ops.h +++ b/intern/atomic/atomic_ops.h @@ -34,6 +34,11 @@ #if defined (__APPLE__) # include <libkern/OSAtomic.h> #elif defined(_MSC_VER) +# define NOGDI +# ifndef NOMINMAX +# define NOMINMAX +# endif +# define WIN32_LEAN_AND_MEAN # include <windows.h> #elif defined(__arm__) /* Attempt to fix compilation error on Debian armel kernel. @@ -72,6 +77,27 @@ # define LG_SIZEOF_INT 2 #endif +/************************/ +/* Function prototypes. */ + +#if (LG_SIZEOF_PTR == 3 || LG_SIZEOF_INT == 3) +ATOMIC_INLINE uint64_t atomic_add_uint64(uint64_t *p, uint64_t x); +ATOMIC_INLINE uint64_t atomic_sub_uint64(uint64_t *p, uint64_t x); +ATOMIC_INLINE uint64_t atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new); +#endif + +ATOMIC_INLINE uint32_t atomic_add_uint32(uint32_t *p, uint32_t x); +ATOMIC_INLINE uint32_t atomic_sub_uint32(uint32_t *p, uint32_t x); +ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new); + +ATOMIC_INLINE size_t atomic_add_z(size_t *p, size_t x); +ATOMIC_INLINE size_t atomic_sub_z(size_t *p, size_t x); +ATOMIC_INLINE size_t atomic_cas_z(size_t *v, size_t old, size_t _new); + +ATOMIC_INLINE unsigned atomic_add_u(unsigned *p, unsigned x); +ATOMIC_INLINE unsigned atomic_sub_u(unsigned *p, unsigned x); +ATOMIC_INLINE unsigned atomic_cas_u(unsigned *v, unsigned old, unsigned _new); + /******************************************************************************/ /* 64-bit operations. */ #if (LG_SIZEOF_PTR == 3 || LG_SIZEOF_INT == 3) @@ -97,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(p, 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(p, -((int64_t)x)); + return InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x)) - x; } ATOMIC_INLINE uint64_t @@ -189,7 +215,7 @@ atomic_sub_uint64(uint64_t *p, uint64_t x) } ATOMIC_INLINE uint64_t -atomic_cas_uint32(uint64_t *v, uint64_t old, uint64_t _new) +atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new) { assert(sizeof(uint64_t) == sizeof(unsigned long)); @@ -209,7 +235,7 @@ atomic_sub_uint64(uint64_t *p, uint64_t x) } ATOMIC_INLINE uint64_t -atomic_cas_uint32(uint64_t *v, uint64_t old, uint64_t _new) +atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new) { return __sync_val_compare_and_swap(v, old, _new); } @@ -242,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 |