lgui中的HeapAlloc函数思路解析

1 view
Skip to first unread message

清钟沁桐

unread,
Jul 5, 2009, 1:19:09 PM7/5/09
to 畅游FPGA世界
#include "../include/common.h"
#include "../include/blockheap.h"


BOOL
HeapCreate(
PPrivateHeap pHeap,
unsigned long BlockNumber,
unsigned long BlockSize
)
{
pthread_mutex_init(&pHeap->mutex,NULL);
pHeap->BlockNumber = BlockNumber;
pHeap->BlockSize = BlockSize + sizeof(unsigned long);
pHeap->free = 0;
pHeap->pData = calloc(pHeap->BlockNumber,pHeap->BlockSize);
if(!pHeap->pData)
return false;
memset(pHeap->pData,0,pHeap->BlockNumber*pHeap->BlockSize);//maybe
unnecessary
return true;

}

void*
HeapAlloc(
PPrivateHeap pHeap
)
{
char* pData=NULL;
unsigned long i;
pthread_mutex_lock(&pHeap->mutex);

pData = pHeap->pData;
for(i=pHeap->free;i<pHeap->BlockNumber;i++){
if(*((unsigned long*)pData) == HEAP_BLOCK_FREE){
*((unsigned long*)pData) = HEAP_BLOCK_USED;
pHeap->free = i + 1;
pthread_mutex_unlock(&pHeap->mutex);
return pData + sizeof(unsigned long);
}
pData += pHeap->BlockSize;
}

pData = calloc(1,pHeap->BlockSize);
*((unsigned long*)pData) = HEAP_BLOCK_OVERFLOW;

pData += sizeof(unsigned long);

pthread_mutex_unlock(&pHeap->mutex);
return pData;
}

void
HeapFree(
PPrivateHeap pHeap,
void* pData
)
{
int i;
char* pBlock;
pthread_mutex_lock(&pHeap->mutex);
pBlock = pData - sizeof(unsigned long);
if(*((unsigned long*)pBlock) == HEAP_BLOCK_OVERFLOW){
free(pBlock);
}
else{
*((unsigned long*)pBlock) = HEAP_BLOCK_FREE;
i = (pBlock - (char*)pHeap->pData)/pHeap->BlockSize;
if(pHeap->free > i)
pHeap->free = i;
}
pthread_mutex_unlock(&pHeap->mutex);
}


void HeapDestroy(PPrivateHeap pHeap)
{
free(pHeap->pData);
}


这个程序是这样的。它维护了一个大Block,这个Block可以分配指定容量的小块内存。具体分配方法是这样的。首先从头到尾扫描一遍整个
pData,看看有没有空闲块,如果有,就返回之。如果都没有了,就只好通过操作系统的calloc进行分配了。那个OVERFLOW的意思是heap
已经满了,分配出来的块其实是操作系统的内存块。

最后释放的时候,应该会检查pData之前的一个long的位置,如果是OVERFLOW,就采用操作系统的释放方法(free),如果不是,就直接标
记为FREE就OK了。因此需要三种状态,以处理不同情况。

清钟沁桐

unread,
Jul 5, 2009, 1:33:46 PM7/5/09
to 畅游FPGA世界
由初始化的 HeapCreate 函数,我们可以知道,这个大的block中的多个 小block的大小是固定的,不会再每次调用的时候发生更改,因
此这个 HeapAlloc 函数不能随意的分配不确定大小的blcok块,这个在嵌入式中使用比较多的原因是因为嵌入式中往往仅仅需要一些指定结构体
的数据存储单元
Reply all
Reply to author
Forward
0 new messages