|
|
//---------------------------------------------------------------------------
#ifndef QueueMemH
#define QueueMemH
#include <vcl.h>
//---------------------------------------------------------------------------
typedef struct{
long nFlag; //1 可分配 2 备用 3 已到末尾
PBYTE pPool; //当前空闲起始地址
long nFreeSize; //当前空闲尺寸
}QUE,*PQUE;
class TQueueMemPool
{
private:
long bWait; //锁
PBYTE pPool; //池起始地址
long nPoolSize; //池尺寸
QUE que[2];
public:
TQueueMemPool(void);
~TQueueMemPool(void);
int init(long nTotalSize);
void * Alloc(long nSize);
void Free(void *pPtr, long nSize);
};
#endif
//===================================================
TQueueMemPool::TQueueMemPool(void)
{ bWait=false;
pPool=NULL; //池起始地址
nPoolSize=0; //池尺寸
memset( que, 0, sizeof(QUE)*2 );
}
TQueueMemPool::~TQueueMemPool(void)
{
if(pPool)
SysFreeMem(pPool);
}
int TQueueMemPool::init(long nTotalSize)
{
if(pPool)
SysFreeMem(pPool);
pPool=(PBYTE)SysGetMem(nTotalSize); //池起始地址
nPoolSize=nTotalSize; //池尺寸
bWait=false;
que[0].pPool=pPool;
que[0].nFlag=1;
que[0].nFreeSize= nPoolSize;
que[1].pPool=pPool;
que[1].nFlag=2;
que[1].nFreeSize= 0;
if(pPool)
return 0;
else
return 1;
}
/*
* 分配 nSize大小的空间
* PVOID 分配的空间的起始地址
*/
void * TQueueMemPool::Alloc(long nSize)
{
PBYTE pPtr=NULL;
while(InterlockedExchange(&bWait, true))
Sleep(0);
if(que[0].nFlag==1)
{
if(que[0].nFreeSize>=nSize)
{
que[0].nFreeSize -= nSize;
pPtr=que[0].pPool;
que[0].pPool+=nSize;
}
else
{
if(que[1].nFlag==2)
{
if(que[1].nFreeSize>=nSize)
{
if(que[1].nFreeSize==que[0].pPool-pPool)
{
que[0].nFlag=2;//已经终止标志
que[0].nFreeSize=0;
que[0].pPool=pPool;
que[1].nFreeSize= nPoolSize;
}
else
{
que[0].nFlag=3;//已经终止标志
}
que[1].nFreeSize -= nSize;
pPtr=que[1].pPool;
que[1].pPool+=nSize;
que[1].nFlag=1;
}
}
}
}
else if(que[1].nFlag==1)
{
if(que[1].nFreeSize>=nSize)
{
que[1].nFreeSize -= nSize;
pPtr=que[1].pPool;
que[1].pPool+=nSize;
}
else
{
if(que[0].nFlag==2)
{
if(que[0].nFreeSize>=nSize)
{
if(que[0].nFreeSize==que[1].pPool-pPool)
{
que[1].nFlag=2;//已经终止标志
que[1].nFreeSize=0;
que[1].pPool=pPool;
que[0].nFreeSize= nPoolSize;
}
else
{
que[1].nFlag=3;//已经终止标志
}
que[0].nFreeSize -= nSize;
pPtr=que[0].pPool;
que[0].pPool+=nSize;
que[0].nFlag=1;
}
}
}
}
InterlockedExchange(&bWait, false);
if(pPtr==NULL)
{ //MessageBox(0,"没有空间分配!","",0);
pPtr=(PBYTE)SysGetMem(nSize);
}
return pPtr;
}
/*
* 释放空间,必须指定内存空间大小
* PVOID pPtr 内存空间
* nSize 内存空间大小
*/
void TQueueMemPool::Free(void *pPtr,long nSize)
{
if( pPtr>=pPool && pPtr<pPool+nPoolSize )
{
while(InterlockedExchange(&bWait, true))
Sleep(0);
if(que[0].pPool + que[0].nFreeSize == pPtr)
{
if(que[1].nFlag==3 && que[1].pPool-nSize==pPtr)
{
nSize=nPoolSize-((PBYTE)pPtr-pPool);
que[1].nFlag=2;
que[1].nFreeSize=0;
que[1].pPool=pPool;
}
que[0].nFreeSize += nSize;
}
else if(que[1].pPool + que[1].nFreeSize == pPtr)
{
if(que[0].nFlag==3 && que[0].pPool-nSize==pPtr)
{
nSize=nPoolSize-((PBYTE)pPtr-pPool);
que[0].nFlag=2;
que[0].nFreeSize=0;
que[0].pPool=pPool;
}
que[1].nFreeSize += nSize;
}
else
MessageBox(0,"没有按顺序回收!","",0);
InterlockedExchange(&bWait, false);
}
else
{
SysFreeMem(pPtr);
}
} |
|