#include "stdafx.h"
#include "MemPool.h"
CMemMgr *CMemMgr::m_pThis = NULL;
CMemMgr::CMemMgr(void)
{
m_szMemCtrl = new char*[MEMCOUNT];
memset(m_szMemCtrl, NUMZERO, sizeof(char*)*MEMCOUNT);
}
CMemMgr::~CMemMgr(void)
{
char *pMem;
for (int i=NUMZERO; i<MEMCOUNT; i++)
{
if (NULL == m_szMemCtrl[i])
{
continue;
}
pMem = GetNextMem(m_szMemCtrl[i]);
delete[] ((char*)(m_szMemCtrl[i] - POINTERSIZE - INTSIZE));
while (pMem)
{
char* pMemTemp = pMem;
pMem = GetNextMem(pMem);
delete[] ((char*)(pMemTemp - POINTERSIZE - INTSIZE));
}
}
delete[] m_szMemCtrl;
m_szMemCtrl = NULL;
}
CMemMgr *CMemMgr::getInstance(void)
{
if (NULL == m_pThis)
{
m_pThis = new CMemMgr;
}
return m_pThis;
}
void *CMemMgr::getMem(unsigned int uiMemLen)
{
int iIdx;
char *pMem;
if (NUMZERO == uiMemLen)
{
return NULL;
}
iIdx = (uiMemLen -NUMONE) / MEMLENSTEP;
if (uiMemLen > MAXMEMLEN)
{
char* p = new char[uiMemLen + POINTERSIZE + INTSIZE];
*(int*)p = uiMemLen;
pMem = p + POINTERSIZE + INTSIZE;
return pMem;
}
// 3. 判断该空闲链表是否有数据;
if (m_szMemCtrl[iIdx])
{
pMem = m_szMemCtrl[iIdx];
m_szMemCtrl[iIdx] = GetNextMem(m_szMemCtrl[iIdx]);
}
else
{
char* p = new char[(iIdx+NUMONE)*MEMLENSTEP + POINTERSIZE + INTSIZE];
*(int*)p = (iIdx+NUMONE) * MEMLENSTEP;
pMem = p + POINTERSIZE + INTSIZE;
SetNextMem(pMem, NULL);
}
return pMem;
}
int CMemMgr::rtnMem(char *pMem)
{
if (NULL == pMem)
{
return FAILRST;
}
int iMemSize = GetMemSize(pMem);
if (iMemSize > MAXMEMLEN)
{
delete[] (char*)(pMem - POINTERSIZE - INTSIZE);
return SUCCRST;
}
if (iMemSize%MEMLENSTEP != NUMZERO)
{
return FAILRST;
}
char* pTemp = m_szMemCtrl[(iMemSize-NUMONE)/MEMLENSTEP];
m_szMemCtrl[(iMemSize-NUMONE)/MEMLENSTEP] = pMem;
SetNextMem(pMem, pTemp);
return SUCCRST;
}