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:
@@ -490,6 +490,7 @@ void MultiThreadedDemo::exitPhysics()
|
||||
delete m_dispatcher;
|
||||
|
||||
#ifdef USE_PARALLEL_DISPATCHER
|
||||
deleteCollisionLocalStoreMemory();
|
||||
if (m_threadSupportCollision)
|
||||
{
|
||||
delete m_threadSupportCollision;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -131,6 +131,9 @@ public:
|
||||
|
||||
virtual btCriticalSection* createCriticalSection();
|
||||
|
||||
virtual void deleteBarrier(btBarrier* barrier);
|
||||
|
||||
virtual void deleteCriticalSection(btCriticalSection* criticalSection);
|
||||
};
|
||||
|
||||
#endif //BT_WIN32_THREAD_SUPPORT_H
|
||||
|
||||
@@ -1157,6 +1157,8 @@ btParallelConstraintSolver::~btParallelConstraintSolver()
|
||||
{
|
||||
delete m_memoryCache;
|
||||
delete m_solverIO;
|
||||
m_solverThreadSupport->deleteBarrier(m_barrier);
|
||||
m_solverThreadSupport->deleteCriticalSection(m_criticalSection);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user