#include "xmemory.h"
#pragma pack(1)typedefstruct{void*pre;void*next;
unsignedintsize;
unsignedcharflag;
}stBlock;#pragma pack()
static stBlock* head =NULL;#define BLOCK_DEFAULT_SIZE 10485760 //1024*1024*10
voidxlock()
{
}voidxunlock()
{
}int remalloc(stBlock*tail)
{static unsigned char blockflag = 1;
stBlock* temhead =NULL;
stBlock* temtaill =NULL;char* nhead = (char*)malloc(BLOCK_DEFAULT_SIZE);if (NULL ==nhead)
{returnErrorInit;
}
memset(nhead,0, BLOCK_DEFAULT_SIZE);
temhead= (stBlock*)nhead;
temhead->pre =tail;
temhead->next = nhead + BLOCK_DEFAULT_SIZE - sizeof(stBlock);
temhead->size = 0;
temhead->flag =blockflag;
temtaill= temhead->next;
temtaill->pre =temhead;
temtaill->next =NULL;
temtaill->size = 0;
temtaill->flag =blockflag;if (NULL ==tail)
{
head=temhead;
}else{
tail->next =temhead;
}
blockflag++;returnNoError;
}void* xmalloc(int size, int*code)
{
stBlock* blk =head;
stBlock* nblk =NULL;
stBlock* blknext =NULL;char* ret =NULL;if (size >=BLOCK_DEFAULT_SIZE)
{if(code){*code =ErrorOverBlockSize;
}returnNULL;
}
xlock();if (NULL ==head)
{if(ErrorInit == remalloc(NULL) /*initMemory(BLOCK_DEFAULT_SIZE)*/){
xunlock();if(code){*code =ErrorInit;
}returnNULL;
}
blk=head;
}do{int validsize = (char*)blk->next - (char*)blk - sizeof(stBlock)*2 - blk->size;if(validsize >=size){
nblk= (stBlock*)((char*)blk+sizeof(stBlock)+blk->size);
nblk->size =size;
nblk->next = blk->next;
nblk->pre =blk;
nblk->flag = blk->flag;
blk->next =nblk;break;
}else{
blk= blk->next;if (NULL == blk->next)
{if (ErrorInit ==remalloc(blk))
{
xunlock();if(code){*code =ErrorInit;
}returnNULL;
}
}
blknext= blk->next;if (blk->flag != blknext->flag)
{
blk= blk->next;
}
}
}while (1);
ret= (char*)nblk+sizeof(stBlock);
memset(ret,0, size);
xunlock();if(code){*code =NoError;
}returnret;
}void xfree(void*data)
{
stBlock* blk =head;
stBlock* preblk =NULL;
xlock();do{if ((char*)blk+sizeof(stBlock) ==data)
{
preblk= blk->pre;
preblk->next = blk->next;break;
}else{
blk= blk->next;
}
}while(blk);
xunlock();
}