better fix for memory issue of BulletMultiThreaded

See Issue 271 and
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=4043
This commit is contained in:
erwin.coumans
2012-09-09 21:25:00 +00:00
parent ccfbb9fd79
commit 6b8a571438
9 changed files with 53 additions and 2 deletions

View File

@@ -490,6 +490,7 @@ void MultiThreadedDemo::exitPhysics()
delete m_dispatcher;
#ifdef USE_PARALLEL_DISPATCHER
deleteCollisionLocalStoreMemory();
if (m_threadSupportCollision)
{
delete m_threadSupportCollision;

View File

@@ -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

View File

@@ -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)
{

View File

@@ -190,10 +190,27 @@ void* createCollisionLocalStoreMemory()
{
return &gLocalStoreMemory;
}
void deleteCollisionLocalStoreMemory()
{
}
#else
btAlignedObjectArray<CollisionTask_LocalStoreMemory*> 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<sLocalStorePointers.size();i++)
{
delete sLocalStorePointers[i];
}
sLocalStorePointers.clear();
}
#endif

View File

@@ -47,7 +47,7 @@ __attribute__ ((aligned (128)))
void processCollisionTask(void* userPtr, void* lsMemory);
void* createCollisionLocalStoreMemory();
void deleteCollisionLocalStoreMemory();
#if defined(USE_LIBSPE2) && defined(__SPU__)
#include "../SpuLibspe2Support.h"

View File

@@ -440,6 +440,16 @@ btCriticalSection* Win32ThreadSupport::createCriticalSection()
return cs;
}
void Win32ThreadSupport::deleteBarrier(btBarrier* barrier)
{
barrier->~btBarrier();
btAlignedFree(barrier);
}
void Win32ThreadSupport::deleteCriticalSection(btCriticalSection* criticalSection)
{
criticalSection->~btCriticalSection();
}
#endif //USE_WIN32_THREADING

View File

@@ -131,6 +131,9 @@ public:
virtual btCriticalSection* createCriticalSection();
virtual void deleteBarrier(btBarrier* barrier);
virtual void deleteCriticalSection(btCriticalSection* criticalSection);
};
#endif //BT_WIN32_THREAD_SUPPORT_H

View File

@@ -1157,6 +1157,8 @@ btParallelConstraintSolver::~btParallelConstraintSolver()
{
delete m_memoryCache;
delete m_solverIO;
m_solverThreadSupport->deleteBarrier(m_barrier);
m_solverThreadSupport->deleteCriticalSection(m_criticalSection);
}

View File

@@ -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; }