42,8 → 42,8 |
struct mem_block { |
struct mem_block *next; |
struct mem_block *prev; |
int start; |
int size; |
u32_t start; |
size_t size; |
}; |
|
/* Initialize. How to check for an uninitialized heap? |
50,15 → 50,15 |
*/ |
static int init_heap(struct mem_block **heap, int start, int size) |
{ |
struct mem_block *blocks = kmalloc(sizeof(*blocks)); |
struct mem_block *blocks = malloc(sizeof(*blocks)); |
|
if (!blocks) |
return -1; //-ENOMEM; |
|
*heap = kmalloc(sizeof(**heap)); |
*heap = malloc(sizeof(**heap)); |
if (!*heap) |
{ |
kfree(blocks); |
free(blocks); |
return -1; //-ENOMEM; |
} |
|
68,6 → 68,7 |
|
__clear(*heap,sizeof(**heap)); |
(*heap)->next = (*heap)->prev = blocks; |
(*heap)->start |= USED_BLOCK; |
return 0; |
} |
|
90,7 → 91,7 |
/* Maybe cut off the end of an existing block */ |
if (size < p->size) |
{ |
struct mem_block *newblock = kmalloc(sizeof(*newblock)); |
struct mem_block *newblock = malloc(sizeof(*newblock)); |
if (!newblock) |
goto out; |
newblock->start = p->start + size; |
100,7 → 101,7 |
p->next->prev = newblock; |
p->next = newblock; |
p->size = size; |
p->start|=1; |
p->start|=USED_BLOCK; |
} |
|
out: |
113,6 → 114,7 |
|
list_for_each(p, heap) |
{ |
|
if ( !(p->start & USED_BLOCK) && size <= p->size) |
return split_block(p, size); |
} |
128,7 → 130,6 |
list_for_each(p, heap) |
if ((p->start & ~USED_BLOCK) == start) |
return p; |
|
return NULL; |
} |
|
147,7 → 148,7 |
p->size += q->size; |
p->next = q->next; |
p->next->prev = p; |
kfree(q); |
free(q); |
} |
|
if ( !(p->prev->start & USED_BLOCK)) |
156,7 → 157,7 |
q->size += p->size; |
q->next = p->next; |
q->next->prev = q; |
kfree(p); |
free(p); |
} |
} |
|
201,7 → 202,7 |
if (!block) |
return -1; |
|
if ( !(block->start & 1)) |
if ( !(block->start & USED_BLOCK)) |
return -1; |
|
free_block(block); |
208,4 → 209,17 |
return 0; |
} |
|
void dump_mem() |
{ |
struct mem_block *p; |
struct mem_block **heap; |
|
heap = &rhd.fb_heap; |
|
list_for_each(p, *heap) |
{ |
dbgprintf("block: %x next: %x prev: %x start: %x size:%x\n", |
p,p->next,p->prev,p->start,p->size); |
} |
} |
|