📄 memmgr.cpp
字号:
/*=========================================================
* File name : memmgr.cpp
* Description : 内存管理:管理非固定长度内存,支持多线程
* 但注意有最大长度限制MAX_MEM_BLOCK,超过此长度内存由
* OS自己管理。
*
* Modify :
*=========================================================*/
#include "memmgr.h"
#include "fstream"
#include "globalref.h"
using namespace std;
memmgr g_pMemManger;
//inline
BYTE *MyMemAlloc(UINT bytes)
{
return g_pMemManger.Alloc(bytes);
}
//inline
void MyMemFree(void* block)
{
g_pMemManger.Free((BYTE*)block);
}
void memmgr::ASSERT_MyMemBlock(void* block)
{
#ifdef _DEBUG
if(block==NULL)
return ;
BYTE *x = (BYTE*)block-4;
ASSERT(_CrtIsMemoryBlock((const void *)x, (*(UINT*)x)>>OFFSETSIZE, NULL, NULL, NULL ));
#endif
}
memmgr::memmgr()
{
#ifdef MEM_CONTROL_FLUX
for( int i = 0; i < MAX_MEM_BLOCK >>OFFSETSIZE; i++ )g_CacheNum[i] = 0;
#endif
memset(m_Cache,0,(MAX_MEM_BLOCK >>OFFSETSIZE)*sizeof(m_Cache[0]));
}
memmgr::~memmgr()
{
for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
{
m_lock.Lock();
if (m_Cache[i] != NULL)
{
while (m_Cache[i] != NULL)
{
BYTE** x = (BYTE**) m_Cache[i];
m_Cache[i] = *x;
#ifdef _DEBUG
*(UINT*)(x) = (i<<OFFSETSIZE);
VerifyMem((char*)x+4);
#endif
free((BYTE*)x);
}
}
m_lock.Unlock(8);
}
}
void memmgr::Load(const char *filename)
{
ifstream fin;
fin.open(filename);
int nCount;
for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
{
nCount = 0;
fin>>nCount;
for(int j = 0;j<nCount;j++)
{
void *p = malloc(i<<OFFSETSIZE);
Free(p);
}
}
}
void memmgr::Save(const char *filename)
{
ofstream fout;
fout.open(filename,ios::out|ios::trunc);
int nCount = 0;
for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
{
nCount = 0;
m_lock.Lock();
if (m_Cache[i] != NULL)
{
while (m_Cache[i] != NULL)
{
BYTE** x = (BYTE**) m_Cache[i];
m_Cache[i] = *x;
nCount ++ ;
}
}
fout<<nCount;
fout<<"\n";
m_lock.Unlock(9);
}
}
#ifdef _DEBUG
void memmgr::VerifyMem(char *x)
{
ASSERT(x);
x = x-4;
UINT bytes = *(UINT*)x;
for(int i = 0;i<MEMMGR_SIZE_D;i++)
{
ASSERT(*(x+bytes+4+i) == 0x78);
}
}
#else
void memmgr::VerifyMem(char *x)
{
}
#endif
BYTE* memmgr::Alloc(UINT bytes)
{
if (bytes == 0)
return NULL;
bytes= MEMALIGN(bytes);
UINT AllocBytes = bytes+4+MEMMGR_SIZE_D;
BYTE* x;
// Large block?
if (bytes >= MAX_MEM_BLOCK)
{
x = (BYTE*)(malloc (AllocBytes));
#ifdef MEM_CONTROL_FLUX
if (x == NULL)
{
printfmeminfo();
return NULL;
}
#endif
CHECKPOINTNULL(x, "memmgr::Alloc malloc fail!\r\n");
*(UINT*)(x) = bytes;
#ifdef MEM_CONTROL_FLUX
g_MemTotal = g_MemTotal + AllocBytes;
#endif
#ifdef _DEBUG
memset(x+bytes+4,0x78,MEMMGR_SIZE_D);
#endif
return x+4;
}
// No block in cache?
UINT cindex = bytes >> OFFSETSIZE;
// ASSERT(cindex>0);
m_lock.Lock();
x = m_Cache[cindex];
if (x == NULL)
{
m_lock.Unlock(5);
x = (BYTE*)(malloc (AllocBytes));
#ifdef MEM_CONTROL_FLUX
if (x == NULL)
{
printfmeminfo();
return NULL;
}
#endif
*(UINT*)(x) = bytes;
#ifdef MEM_CONTROL_FLUX
g_MemTotal = g_MemTotal + AllocBytes;
#endif
#ifdef _DEBUG
memset(x+bytes+4,0x78,MEMMGR_SIZE_D);
#endif
return x+4;
}
// Return block from cache, update it
BYTE** x_fp = (BYTE**) x;
m_Cache[cindex] = *x_fp;
*(UINT*)(x) = bytes;
m_lock.Unlock(6);
#ifdef MEM_CONTROL_FLUX
g_CacheNum[cindex]--;
#endif
VerifyMem((char*)(x+4));
return x+4;
}
void memmgr::Free (void* blk)
{
if(blk==NULL)
return ;
VerifyMem((char*)blk);
BYTE *x = (BYTE*)blk-4;
UINT bytes = *(UINT*)x;
#ifdef MEM_CONTROL_FLUX
UINT ncount = bytes;
#endif
if (bytes >= MAX_MEM_BLOCK)
{
free (x);
#ifdef MEM_CONTROL_FLUX
g_MemTotal = g_MemTotal - ncount;
#endif
return;
}
UINT cindex = bytes >> OFFSETSIZE;
BYTE** blk_fp = (BYTE**) x;
#ifdef MEM_CONTROL_FLUX
if( g_CacheNum[ cindex ] < MEM_MEMMGR_MAX)
{
#endif
m_lock.Lock();
*blk_fp = m_Cache[cindex];
m_Cache[cindex] = (BYTE*) x;
m_lock.Unlock(7);
#ifdef MEM_CONTROL_FLUX
g_CacheNum[ cindex ]++;
}
else
{
free( x );
g_MemTotal = g_MemTotal - ncount;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -