fix potential memory leak in previous commit related to InMemoryFileIO class.
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user