atomic_ops: add `atomic_cas_float` helper.
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 23 Nov 2017 20:17:16 +0000 (21:17 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 23 Nov 2017 20:17:16 +0000 (21:17 +0100)
intern/atomic/atomic_ops.h
intern/atomic/intern/atomic_ops_ext.h

index 578cfb76eb67961320dedc33daf79146ab6f00e4..e849bcf6cef7a31f3e844e0cf6b740156dfd41ef 100644 (file)
@@ -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). */
index 7eef20f46d31606084b90e83a8125f0aa150902c..1b1fea9642d430678d2fc0177f1cfe782ec9e8a9 100644 (file)
@@ -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;