fix potential memory leak in previous commit related to InMemoryFileIO class.

This commit is contained in:
erwincoumans
2018-10-16 18:31:17 -07:00
parent 79f6cc901e
commit 8825b39f6c

View File

@@ -1,5 +1,3 @@
#include "fileIOPlugin.h" #include "fileIOPlugin.h"
#include "../../SharedMemoryPublic.h" #include "../../SharedMemoryPublic.h"
#include "../b3PluginContext.h" #include "../b3PluginContext.h"
@@ -46,9 +44,14 @@ struct InMemoryFileIO : public CommonFileIOInterface
{ {
b3HashMap<b3HashString,InMemoryFile*> m_fileCache; b3HashMap<b3HashString,InMemoryFile*> m_fileCache;
InMemoryFileAccessor m_fileHandles[B3_MAX_FILEIO_INTERFACES]; InMemoryFileAccessor m_fileHandles[B3_MAX_FILEIO_INTERFACES];
int m_numAllocs;
int m_numFrees;
InMemoryFileIO() InMemoryFileIO()
{ {
m_numAllocs=0;
m_numFrees=0;
for (int i=0;i<B3_FILEIO_MAX_FILES;i++) for (int i=0;i<B3_FILEIO_MAX_FILES;i++)
{ {
m_fileHandles[i].m_curPos = 0; m_fileHandles[i].m_curPos = 0;
@@ -59,8 +62,11 @@ struct InMemoryFileIO : public CommonFileIOInterface
virtual ~InMemoryFileIO() virtual ~InMemoryFileIO()
{ {
clearCache(); clearCache();
if (m_numAllocs != m_numFrees)
{
printf("ErrorInMemoryFile (numAllocs %d !\ numFrees %d\n", m_numAllocs, m_numFrees);
}
} }
void clearCache() void clearCache()
{ {
for (int i=0;i<m_fileCache.size();i++) for (int i=0;i<m_fileCache.size();i++)
@@ -70,7 +76,9 @@ struct InMemoryFileIO : public CommonFileIOInterface
{ {
InMemoryFile* mem = *memPtr; InMemoryFile* mem = *memPtr;
freeBuffer(mem->m_buffer); freeBuffer(mem->m_buffer);
m_numFrees++;
delete (mem); delete (mem);
m_numFrees++;
} }
} }
} }
@@ -80,6 +88,7 @@ struct InMemoryFileIO : public CommonFileIOInterface
char* buffer = 0; char* buffer = 0;
if (len) if (len)
{ {
m_numAllocs++;
buffer = new char[len]; buffer = new char[len];
} }
return buffer; return buffer;
@@ -92,6 +101,7 @@ struct InMemoryFileIO : public CommonFileIOInterface
virtual int registerFile(const char* fileName, char* buffer, int len) virtual int registerFile(const char* fileName, char* buffer, int len)
{ {
m_numAllocs++;
InMemoryFile* f = new InMemoryFile(); InMemoryFile* f = new InMemoryFile();
f->m_buffer = buffer; f->m_buffer = buffer;
f->m_fileSize = len; f->m_fileSize = len;
@@ -227,7 +237,6 @@ struct InMemoryFileIO : public CommonFileIOInterface
} }
if (c && c!='\n') if (c && c!='\n')
{ {
char a='\r';
if (c!=13) if (c!=13)
{ {
destBuffer[numRead++]=c; destBuffer[numRead++]=c;
@@ -347,8 +356,12 @@ struct WrapperFileIO : public CommonFileIOInterface
if (slot>=0) if (slot>=0)
{ {
//first check the cache //first check the cache
int childHandle = m_cachedFiles.fileOpen(fileName, mode); int cacheHandle = m_cachedFiles.fileOpen(fileName, mode);
if (childHandle<0) if (cacheHandle>=0)
{
m_cachedFiles.fileClose(cacheHandle);
}
if (cacheHandle<0)
{ {
for (int i=0;i<B3_MAX_FILEIO_INTERFACES;i++) for (int i=0;i<B3_MAX_FILEIO_INTERFACES;i++)
{ {
@@ -444,7 +457,6 @@ struct WrapperFileIO : public CommonFileIOInterface
} }
virtual void fileClose(int fileHandle) virtual void fileClose(int fileHandle)
{ {
int fileReadResult=-1;
if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES) if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES)
{ {
if (m_wrapperFileHandles[fileHandle].childFileIO) if (m_wrapperFileHandles[fileHandle].childFileIO)
@@ -477,7 +489,6 @@ struct WrapperFileIO : public CommonFileIOInterface
{ {
char* result = 0; char* result = 0;
int fileReadResult=-1;
if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES) if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES)
{ {
if (m_wrapperFileHandles[fileHandle].childFileIO) if (m_wrapperFileHandles[fileHandle].childFileIO)
@@ -493,7 +504,6 @@ struct WrapperFileIO : public CommonFileIOInterface
{ {
int numBytes = 0; int numBytes = 0;
int fileReadResult=-1;
if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES) if (fileHandle>=0 && fileHandle<B3_MAX_FILEIO_INTERFACES)
{ {
if (m_wrapperFileHandles[fileHandle].childFileIO) if (m_wrapperFileHandles[fileHandle].childFileIO)
@@ -589,8 +599,7 @@ B3_SHARED_API int executePluginCommand_fileIOPlugin(struct b3PluginContext* cont
case eCNSFileIO: case eCNSFileIO:
{ {
#ifdef B3_USE_CNS_FILEIO #ifdef B3_USE_CNS_FILEIO
B3_USE_ZIPFILE_FILEIO if (strlen(arguments->m_text))
if (arguments->m_text)
{ {
obj->m_fileIO.addFileIOInterface(new CNSFileIO(arguments->m_text)); obj->m_fileIO.addFileIOInterface(new CNSFileIO(arguments->m_text));
} }