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;
|
delete m_dispatcher;
|
||||||
|
|
||||||
#ifdef USE_PARALLEL_DISPATCHER
|
#ifdef USE_PARALLEL_DISPATCHER
|
||||||
|
deleteCollisionLocalStoreMemory();
|
||||||
if (m_threadSupportCollision)
|
if (m_threadSupportCollision)
|
||||||
{
|
{
|
||||||
delete m_threadSupportCollision;
|
delete m_threadSupportCollision;
|
||||||
|
|||||||
@@ -396,5 +396,14 @@ btCriticalSection* PosixThreadSupport::createCriticalSection()
|
|||||||
return new PosixCriticalSection();
|
return new PosixCriticalSection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PosixThreadSupport::deleteBarrier(btBarrier* barrier)
|
||||||
|
{
|
||||||
|
delete barrier;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PosixThreadSupport::deleteCriticalSection(btCriticalSection* cs)
|
||||||
|
{
|
||||||
|
delete cs;
|
||||||
|
}
|
||||||
#endif // USE_PTHREADS
|
#endif // USE_PTHREADS
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,11 @@ public:
|
|||||||
|
|
||||||
virtual btCriticalSection* createCriticalSection();
|
virtual btCriticalSection* createCriticalSection();
|
||||||
|
|
||||||
|
virtual void deleteBarrier(btBarrier* barrier);
|
||||||
|
|
||||||
|
virtual void deleteCriticalSection(btCriticalSection* criticalSection);
|
||||||
|
|
||||||
|
|
||||||
virtual void* getThreadLocalMemory(int taskId)
|
virtual void* getThreadLocalMemory(int taskId)
|
||||||
{
|
{
|
||||||
return m_activeSpuStatus[taskId].m_lsMemory;
|
return m_activeSpuStatus[taskId].m_lsMemory;
|
||||||
|
|||||||
@@ -190,10 +190,27 @@ void* createCollisionLocalStoreMemory()
|
|||||||
{
|
{
|
||||||
return &gLocalStoreMemory;
|
return &gLocalStoreMemory;
|
||||||
}
|
}
|
||||||
|
void deleteCollisionLocalStoreMemory()
|
||||||
|
{
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
btAlignedObjectArray<CollisionTask_LocalStoreMemory*> sLocalStorePointers;
|
||||||
|
|
||||||
void* createCollisionLocalStoreMemory()
|
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
|
#endif
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ __attribute__ ((aligned (128)))
|
|||||||
void processCollisionTask(void* userPtr, void* lsMemory);
|
void processCollisionTask(void* userPtr, void* lsMemory);
|
||||||
|
|
||||||
void* createCollisionLocalStoreMemory();
|
void* createCollisionLocalStoreMemory();
|
||||||
|
void deleteCollisionLocalStoreMemory();
|
||||||
|
|
||||||
#if defined(USE_LIBSPE2) && defined(__SPU__)
|
#if defined(USE_LIBSPE2) && defined(__SPU__)
|
||||||
#include "../SpuLibspe2Support.h"
|
#include "../SpuLibspe2Support.h"
|
||||||
|
|||||||
@@ -440,6 +440,16 @@ btCriticalSection* Win32ThreadSupport::createCriticalSection()
|
|||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Win32ThreadSupport::deleteBarrier(btBarrier* barrier)
|
||||||
|
{
|
||||||
|
barrier->~btBarrier();
|
||||||
|
btAlignedFree(barrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Win32ThreadSupport::deleteCriticalSection(btCriticalSection* criticalSection)
|
||||||
|
{
|
||||||
|
criticalSection->~btCriticalSection();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //USE_WIN32_THREADING
|
#endif //USE_WIN32_THREADING
|
||||||
|
|||||||
@@ -131,6 +131,9 @@ public:
|
|||||||
|
|
||||||
virtual btCriticalSection* createCriticalSection();
|
virtual btCriticalSection* createCriticalSection();
|
||||||
|
|
||||||
|
virtual void deleteBarrier(btBarrier* barrier);
|
||||||
|
|
||||||
|
virtual void deleteCriticalSection(btCriticalSection* criticalSection);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //BT_WIN32_THREAD_SUPPORT_H
|
#endif //BT_WIN32_THREAD_SUPPORT_H
|
||||||
|
|||||||
@@ -1157,6 +1157,8 @@ btParallelConstraintSolver::~btParallelConstraintSolver()
|
|||||||
{
|
{
|
||||||
delete m_memoryCache;
|
delete m_memoryCache;
|
||||||
delete m_solverIO;
|
delete m_solverIO;
|
||||||
|
m_solverThreadSupport->deleteBarrier(m_barrier);
|
||||||
|
m_solverThreadSupport->deleteCriticalSection(m_criticalSection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ public:
|
|||||||
|
|
||||||
virtual btCriticalSection* createCriticalSection() = 0;
|
virtual btCriticalSection* createCriticalSection() = 0;
|
||||||
|
|
||||||
|
virtual void deleteBarrier(btBarrier* barrier)=0;
|
||||||
|
|
||||||
|
virtual void deleteCriticalSection(btCriticalSection* criticalSection)=0;
|
||||||
|
|
||||||
virtual void* getThreadLocalMemory(int taskId) { return 0; }
|
virtual void* getThreadLocalMemory(int taskId) { return 0; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user