Fix memory leak due to batchRayCast never deleting the btTaskScheduler.

(and issue with TaskScheduler/btTaskScheduler.cpp, add JobQueue::exit, call it first, since it uses the m_threadSupport which was deleted before the destrucor was called.
Use a hashmap to store user timers, to avoid allocating many identical strings.
This commit is contained in:
erwincoumans
2018-06-16 09:37:53 -07:00
parent cb1fce7899
commit 04d03d10be
6 changed files with 77 additions and 17 deletions

View File

@@ -49,7 +49,7 @@ struct PhysicsClientSharedMemoryInternalData {
SharedMemoryBlock* m_testBlock1;
btAlignedObjectArray<CProfileSample* > m_profileTimings;
btAlignedObjectArray<std::string* > m_profileTimingStrings;
btHashMap<btHashString, std::string*> m_profileTimingStringArray;
btHashMap<btHashInt,BodyJointInfoCache*> m_bodyJointMap;
btHashMap<btHashInt,b3UserConstraint> m_userConstraintInfoMap;
@@ -221,6 +221,16 @@ PhysicsClientSharedMemory::~PhysicsClientSharedMemory() {
}
resetData();
for (int i=0;i<m_data->m_profileTimingStringArray.size();i++)
{
std::string** str = m_data->m_profileTimingStringArray.getAtIndex(i);
if (str)
{
delete *str;
}
}
m_data->m_profileTimingStringArray.clear();
if (m_data->m_ownsSharedMemory)
{
delete m_data->m_sharedMemory;
@@ -239,6 +249,8 @@ void PhysicsClientSharedMemory::removeCachedBody(int bodyUniqueId)
}
void PhysicsClientSharedMemory::resetData()
{
m_data->m_debugLinesFrom.clear();
m_data->m_debugLinesTo.clear();
m_data->m_debugLinesColor.clear();
@@ -1916,10 +1928,17 @@ void PhysicsClientSharedMemory::getUserDataInfo(int bodyUniqueId, int linkIndex,
void PhysicsClientSharedMemory::pushProfileTiming(const char* timingName)
{
std::string* str = new std::string(timingName);
m_data->m_profileTimingStrings.push_back(str);
std::string** strPtr = m_data->m_profileTimingStringArray[timingName];
std::string* str = 0;
if (strPtr)
{
str = *strPtr;
} else
{
str = new std::string(timingName);
m_data->m_profileTimingStringArray.insert(timingName,str);
}
m_data->m_profileTimings.push_back(new CProfileSample(str->c_str()));
}