Add an 'atomic cas' wrapper for pointers.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 25 Sep 2017 08:40:50 +0000 (10:40 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 25 Sep 2017 08:40:50 +0000 (10:40 +0200)
Avoids having to repeat obfuscating castings everywhere...

intern/atomic/atomic_ops.h
intern/atomic/intern/atomic_ops_ext.h
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/editderivedmesh.c
source/blender/blenkernel/intern/subsurf_ccg.c

index 72813c39ac20c672f19c78cc419a969859b9ea8a..38670be56fd1270e2f9e922c7330a747912a4a4d 100644 (file)
@@ -108,6 +108,8 @@ ATOMIC_INLINE unsigned int atomic_fetch_and_add_u(unsigned int *p, unsigned int
 ATOMIC_INLINE unsigned int atomic_fetch_and_sub_u(unsigned int *p, unsigned int x);
 ATOMIC_INLINE unsigned int atomic_cas_u(unsigned int *v, unsigned int old, unsigned int _new);
 
+ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_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 8d5f2e5dad7ca7240775674ac0a307e522453fcd..34158a0b45edd44d488f6ac04b40f9bb4309e48b 100644 (file)
@@ -179,6 +179,18 @@ ATOMIC_INLINE unsigned int atomic_cas_u(unsigned int *v, unsigned int old, unsig
 #endif
 }
 
+/******************************************************************************/
+/* Pointer operations. */
+
+ATOMIC_INLINE void *atomic_cas_ptr(void **v, void *old, void *_new)
+{
+#if (LG_SIZEOF_PTR == 8)
+       return (void *)atomic_cas_uint64((uint64_t *)v, *(uint64_t *)&old, *(uint64_t *)&_new);
+#elif (LG_SIZEOF_PTR == 4)
+       return (void *)atomic_cas_uint32((uint32_t *)v, *(uint32_t *)&old, *(uint32_t *)&_new);
+#endif
+}
+
 /******************************************************************************/
 /* float operations. */
 
index 4d94ebfed77b8ab7658f76e6282f1454c93289a4..2c61cf28691f6093e99e4401d17a8fa68bd0e961 100644 (file)
@@ -1930,7 +1930,7 @@ void CDDM_recalc_looptri(DerivedMesh *dm)
                cddm->dm.looptris.array_wip);
 
        BLI_assert(cddm->dm.looptris.array == NULL);
-       atomic_cas_z((size_t *)&cddm->dm.looptris.array, *(size_t *)&cddm->dm.looptris.array, *(size_t *)&cddm->dm.looptris.array_wip);
+       atomic_cas_ptr((void **)&cddm->dm.looptris.array, cddm->dm.looptris.array, cddm->dm.looptris.array_wip);
        cddm->dm.looptris.array_wip = NULL;
 }
 
index 357420179ddf61004c9c949b55c97fbbd8f8dace..d810dac7365c05cb773b53e5c3152e8bc5fdc6a5 100644 (file)
@@ -664,7 +664,7 @@ static void emDM_recalcLoopTri(DerivedMesh *dm)
        }
 
        BLI_assert(dm->looptris.array == NULL);
-       atomic_cas_z((size_t *)&dm->looptris.array, *(size_t *)&dm->looptris.array, *(size_t *)&dm->looptris.array_wip);
+       atomic_cas_ptr((void **)&dm->looptris.array, dm->looptris.array, dm->looptris.array_wip);
        dm->looptris.array_wip = NULL;
 }
 
index c580c04e0dfd2a3c0fa29f009e721d8e7b698426..f4ff4dfa019d9e3ed4c3588ebb7a9ac4986ff11d 100644 (file)
@@ -4507,7 +4507,7 @@ static void ccgDM_recalcLoopTri(DerivedMesh *dm)
        }
 
        BLI_assert(dm->looptris.array == NULL);
-       atomic_cas_z((size_t *)&dm->looptris.array, *(size_t *)&dm->looptris.array, *(size_t *)&dm->looptris.array_wip);
+       atomic_cas_ptr((void **)&dm->looptris.array, dm->looptris.array, dm->looptris.array_wip);
        dm->looptris.array_wip = NULL;
 }