diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-05-16 16:56:39 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-05-16 16:56:39 +0300 |
commit | 75a96f832518e33bc032d137ab6f6334676f024c (patch) | |
tree | 4c01372e595bad5986c223635218be614c23679f /intern/atomic | |
parent | 460d94449348647b20fb0d69f60ecc0e6cc36370 (diff) |
Atomic ops: add 'fetch_and_add_uint32' op.
Needed for next commit.
Diffstat (limited to 'intern/atomic')
-rw-r--r-- | intern/atomic/atomic_ops.h | 2 | ||||
-rw-r--r-- | intern/atomic/intern/atomic_ops_msvc.h | 5 | ||||
-rw-r--r-- | intern/atomic/intern/atomic_ops_unix.h | 10 |
3 files changed, 17 insertions, 0 deletions
diff --git a/intern/atomic/atomic_ops.h b/intern/atomic/atomic_ops.h index e4e1bdc1c09..0bc7905aa07 100644 --- a/intern/atomic/atomic_ops.h +++ b/intern/atomic/atomic_ops.h @@ -86,6 +86,8 @@ 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 uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x); + ATOMIC_INLINE uint8_t atomic_fetch_and_or_uint8(uint8_t *p, uint8_t b); ATOMIC_INLINE uint8_t atomic_fetch_and_and_uint8(uint8_t *p, uint8_t b); diff --git a/intern/atomic/intern/atomic_ops_msvc.h b/intern/atomic/intern/atomic_ops_msvc.h index bd9186e7864..15ddda246d9 100644 --- a/intern/atomic/intern/atomic_ops_msvc.h +++ b/intern/atomic/intern/atomic_ops_msvc.h @@ -76,6 +76,11 @@ ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _ne return InterlockedCompareExchange((long *)v, _new, old); } +ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x) +{ + return InterlockedExchangeAdd(p, x); +} + /******************************************************************************/ /* 8-bit operations. */ diff --git a/intern/atomic/intern/atomic_ops_unix.h b/intern/atomic/intern/atomic_ops_unix.h index 05d0fbf1856..bf54750ea0d 100644 --- a/intern/atomic/intern/atomic_ops_unix.h +++ b/intern/atomic/intern/atomic_ops_unix.h @@ -162,6 +162,16 @@ ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _ne # error "Missing implementation for 32-bit atomic operations" #endif +#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4)) +ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x) +{ + return __sync_fetch_and_add(p, x); +} + +#else +# error "Missing implementation for 32-bit atomic operations" +#endif + /******************************************************************************/ /* 8-bit operations. */ #if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_1)) |