From cf6e8edda5e51696a20c76b879d920655d65e81d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 23 Nov 2017 21:17:16 +0100 Subject: atomic_ops: add `atomic_cas_float` helper. --- intern/atomic/atomic_ops.h | 3 +++ intern/atomic/intern/atomic_ops_ext.h | 6 ++++++ 2 files changed, 9 insertions(+) (limited to 'intern/atomic') diff --git a/intern/atomic/atomic_ops.h b/intern/atomic/atomic_ops.h index 578cfb76eb6..e849bcf6cef 100644 --- a/intern/atomic/atomic_ops.h +++ b/intern/atomic/atomic_ops.h @@ -130,6 +130,9 @@ ATOMIC_INLINE unsigned int atomic_cas_u(unsigned int *v, unsigned int old, unsig ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_new); + +ATOMIC_INLINE float atomic_cas_float(float *v, float old, float _new); + /* WARNING! Float 'atomics' are really faked ones, those are actually closer to some kind of spinlock-sync'ed operation, * which means they are only efficient if collisions are highly unlikely (i.e. if probability of two threads * working on the same pointer at the same time is very low). */ diff --git a/intern/atomic/intern/atomic_ops_ext.h b/intern/atomic/intern/atomic_ops_ext.h index 7eef20f46d3..1b1fea9642d 100644 --- a/intern/atomic/intern/atomic_ops_ext.h +++ b/intern/atomic/intern/atomic_ops_ext.h @@ -191,6 +191,12 @@ ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_new) /* float operations. */ ATOMIC_STATIC_ASSERT(sizeof(float) == sizeof(uint32_t), "sizeof(float) != sizeof(uint32_t)"); +ATOMIC_INLINE float atomic_cas_float(float *v, float old, float _new) +{ + uint32_t ret = atomic_cas_uint32((uint32_t *)v, *(uint32_t *)&old, *(uint32_t *)&_new); + return *(float *)&ret; +} + ATOMIC_INLINE float atomic_add_and_fetch_fl(float *p, const float x) { float oldval, newval; -- cgit v1.2.3