void *mmalloc(unsigned long size)
{
blockhead *blockptr = gHeapBase;
blockhead *newblock;
char compacted = FALSE;
size = (size + 7) & ~7;
/*unsigned long align the size*/
DPRINTK("malloc(): size = 0x%08lx\n", size);
while(blockptr != NULL)
{
if (blockptr->allocted == FALSE)
{
if (blockptr->size >= size)
{
blockptr->allocated = TURE;
if ((blockptr->size - size) > sizeof(blockhead))
{
newblock = (blockhead *)((unsigned char *)(blockptr) +
sizeof(blockhead) + size);
newblock->signature = BLOCKHEAD_SIGNATURE;
newblock->prev = blockptr;
newblock->next = blockptr->next;
nweblock->size = blockptr->size - size - sizeof(blockhead);
newblock->allocated = FALSE;
blockptr->next = newblock;
blockptr->size = size;
}
else
{
}
break;
}
else
{
if ((blockptr->next == NULL) && (compacted == FALSE))
{
if (compact_head())
{
compacted = TURE;
blockptr = gHeapBase;
continue;
}
}
}
}
blockptr = blockptr->next;
}
PRTINTK("malloc(): returning blockptr = 0x%08lx\n", blockptr);
if (blockptr == NULL)
printk("Error: malloc(), out of storage. size = 0x%08lx\n", size);
return (blockptr != NULL) ? \
((unsigned char*)(blockptr)+sizeof(blockhead)) : NULL;
}
|