1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "System/MemPool.h"
//#include "System/mmgr.h"
CMemPool mempool;
CMemPool::CMemPool()
{
for (size_t a = 0; a < (MAX_MEM_SIZE + 1); a++) {
nextFree[a] = NULL;
poolSize[a] = 10;
}
}
void* CMemPool::Alloc(size_t numBytes)
{
if (UseExternalMemory(numBytes)) {
#ifdef USE_MMGR
return (void*)new char[numBytes];
#else
return ::operator new(numBytes);
#endif
} else {
void* pnt = nextFree[numBytes];
if (pnt) {
nextFree[numBytes] = (*(void**)pnt);
} else {
#ifdef USE_MMGR
void* newBlock = (void*)new char[numBytes * poolSize[numBytes]];
#else
void* newBlock = ::operator new(numBytes * poolSize[numBytes]);
#endif
for (int i = 0; i < (poolSize[numBytes] - 1); ++i) {
*(void**)&((char*)newBlock)[(i) * numBytes] = (void*)&((char*)newBlock)[(i + 1) * numBytes];
}
*(void**)&((char*)newBlock)[(poolSize[numBytes] - 1) * numBytes] = 0;
pnt = newBlock;
nextFree[numBytes] = (*(void**)pnt);
poolSize[numBytes] *= 2;
}
return pnt;
}
}
void CMemPool::Free(void* pnt, size_t numBytes)
{
if (pnt == NULL) {
return;
}
if (UseExternalMemory(numBytes)) {
#ifdef USE_MMGR
delete[] (char*)pnt;
#else
::operator delete(pnt);
#endif
} else {
*(void**)pnt = nextFree[numBytes];
nextFree[numBytes] = pnt;
}
}
CMemPool::~CMemPool()
{
}
|