diff --git a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp index a8dd7cef8..5d4d3a1a1 100644 --- a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp +++ b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp @@ -490,6 +490,7 @@ void MultiThreadedDemo::exitPhysics() delete m_dispatcher; #ifdef USE_PARALLEL_DISPATCHER + deleteCollisionLocalStoreMemory(); if (m_threadSupportCollision) { delete m_threadSupportCollision; diff --git a/src/BulletMultiThreaded/PosixThreadSupport.cpp b/src/BulletMultiThreaded/PosixThreadSupport.cpp index daf43a1b5..81c0cf86d 100644 --- a/src/BulletMultiThreaded/PosixThreadSupport.cpp +++ b/src/BulletMultiThreaded/PosixThreadSupport.cpp @@ -396,5 +396,14 @@ btCriticalSection* PosixThreadSupport::createCriticalSection() return new PosixCriticalSection(); } +void PosixThreadSupport::deleteBarrier(btBarrier* barrier) +{ + delete barrier; +} + +void PosixThreadSupport::deleteCriticalSection(btCriticalSection* cs) +{ + delete cs; +} #endif // USE_PTHREADS diff --git a/src/BulletMultiThreaded/PosixThreadSupport.h b/src/BulletMultiThreaded/PosixThreadSupport.h index ca47e450f..bf7578f51 100644 --- a/src/BulletMultiThreaded/PosixThreadSupport.h +++ b/src/BulletMultiThreaded/PosixThreadSupport.h @@ -127,6 +127,11 @@ public: virtual btBarrier* createBarrier(); virtual btCriticalSection* createCriticalSection(); + + virtual void deleteBarrier(btBarrier* barrier); + + virtual void deleteCriticalSection(btCriticalSection* criticalSection); + virtual void* getThreadLocalMemory(int taskId) { diff --git a/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp b/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp index e30e359f0..46e4d98c1 100644 --- a/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp +++ b/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp @@ -190,10 +190,27 @@ void* createCollisionLocalStoreMemory() { return &gLocalStoreMemory; } +void deleteCollisionLocalStoreMemory() +{ +} #else + +btAlignedObjectArray sLocalStorePointers; + void* createCollisionLocalStoreMemory() { - return new CollisionTask_LocalStoreMemory; + CollisionTask_LocalStoreMemory* localStore = new CollisionTask_LocalStoreMemory; + sLocalStorePointers.push_back(localStore); + return localStore; +} + +void deleteCollisionLocalStoreMemory() +{ + for (int i=0;i~btBarrier(); + btAlignedFree(barrier); +} + +void Win32ThreadSupport::deleteCriticalSection(btCriticalSection* criticalSection) +{ + criticalSection->~btCriticalSection(); +} #endif //USE_WIN32_THREADING diff --git a/src/BulletMultiThreaded/Win32ThreadSupport.h b/src/BulletMultiThreaded/Win32ThreadSupport.h index abf5d21e5..f688e6c85 100644 --- a/src/BulletMultiThreaded/Win32ThreadSupport.h +++ b/src/BulletMultiThreaded/Win32ThreadSupport.h @@ -131,6 +131,9 @@ public: virtual btCriticalSection* createCriticalSection(); + virtual void deleteBarrier(btBarrier* barrier); + + virtual void deleteCriticalSection(btCriticalSection* criticalSection); }; #endif //BT_WIN32_THREAD_SUPPORT_H diff --git a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp index 2e400de1b..08d9a2ba5 100644 --- a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp +++ b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp @@ -1157,6 +1157,8 @@ btParallelConstraintSolver::~btParallelConstraintSolver() { delete m_memoryCache; delete m_solverIO; + m_solverThreadSupport->deleteBarrier(m_barrier); + m_solverThreadSupport->deleteCriticalSection(m_criticalSection); } diff --git a/src/BulletMultiThreaded/btThreadSupportInterface.h b/src/BulletMultiThreaded/btThreadSupportInterface.h index 16850e222..bbe7264bd 100644 --- a/src/BulletMultiThreaded/btThreadSupportInterface.h +++ b/src/BulletMultiThreaded/btThreadSupportInterface.h @@ -76,6 +76,10 @@ public: virtual btBarrier* createBarrier() = 0; virtual btCriticalSection* createCriticalSection() = 0; + + virtual void deleteBarrier(btBarrier* barrier)=0; + + virtual void deleteCriticalSection(btCriticalSection* criticalSection)=0; virtual void* getThreadLocalMemory(int taskId) { return 0; }