From: <ole...@us...> - 2007-12-21 12:10:45
|
Revision: 1337 http://opende.svn.sourceforge.net/opende/?rev=1337&view=rev Author: oleh_derevenko Date: 2007-12-21 04:10:31 -0800 (Fri, 21 Dec 2007) Log Message: ----------- Change: s_CachedPosr cache removed by default as it is incompatible with multithreading (re-implement it via atomic exchange if you need it) Modified Paths: -------------- trunk/ode/src/collision_kernel.cpp Modified: trunk/ode/src/collision_kernel.cpp =================================================================== --- trunk/ode/src/collision_kernel.cpp 2007-12-20 02:32:06 UTC (rev 1336) +++ trunk/ode/src/collision_kernel.cpp 2007-12-21 12:10:31 UTC (rev 1337) @@ -51,43 +51,54 @@ // this struct records the parameters passed to dCollideSpaceGeom() +#if defined(dUSE_POSR_CACHING) +// This caching prevents from using collisions in multiple threads. +// It should be re-implemented via atomic (interlocked) exchange. + // Allocate and free posr - we cache a single posr to avoid thrashing static dxPosR* s_cachedPosR = 0; +#endif -dxPosR* dAllocPosr() +static inline dxPosR* dAllocPosr() { dxPosR* retPosR; +#if defined(dUSE_POSR_CACHING) if (s_cachedPosR) { retPosR = s_cachedPosR; s_cachedPosR = 0; } else +#endif { retPosR = (dxPosR*) dAlloc (sizeof(dxPosR)); } return retPosR; } -void dFreePosr(dxPosR* oldPosR) +static inline void dFreePosr(dxPosR* oldPosR) { - if (oldPosR) +#if defined(dUSE_POSR_CACHING) + if (!s_cachedPosR) { - if (s_cachedPosR) - { - dFree(s_cachedPosR, sizeof(dxPosR)); - } s_cachedPosR = oldPosR; } + else +#endif + { + dFree(oldPosR, sizeof(dxPosR)); + } } void dClearPosrCache(void) { +#if defined(dUSE_POSR_CACHING) if (s_cachedPosR) { dFree(s_cachedPosR, sizeof(dxPosR)); s_cachedPosR = 0; } +#endif } struct SpaceGeomColliderData { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |