forked from bartvdbraak/blender
Add an 'atomic cas' wrapper for pointers.
Avoids having to repeat obfuscating castings everywhere...
This commit is contained in:
parent
01a3c6b204
commit
1d8aebaa09
@ -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). */
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user