2009-04-26 10:15:58 -04:00
|
|
|
#define FREE_LIST_COUNT 16
|
|
|
|
#define BLOCK_SIZE_INCREMENT 32
|
|
|
|
|
|
|
|
typedef struct {
|
2009-04-26 11:02:52 -04:00
|
|
|
F_FREE_BLOCK *small_blocks[FREE_LIST_COUNT];
|
|
|
|
F_FREE_BLOCK *large_blocks;
|
2009-04-26 10:15:58 -04:00
|
|
|
} F_HEAP_FREE_LIST;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
typedef struct {
|
|
|
|
F_SEGMENT *segment;
|
2009-04-26 10:15:58 -04:00
|
|
|
F_HEAP_FREE_LIST free;
|
2007-09-20 18:09:08 -04:00
|
|
|
} F_HEAP;
|
|
|
|
|
2009-04-26 10:15:58 -04:00
|
|
|
typedef void (*HEAP_ITERATOR)(F_BLOCK *compiled);
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
void new_heap(F_HEAP *heap, CELL size);
|
|
|
|
void build_free_list(F_HEAP *heap, CELL size);
|
2009-03-19 04:45:37 -04:00
|
|
|
F_BLOCK *heap_allot(F_HEAP *heap, CELL size);
|
2009-01-24 21:13:17 -05:00
|
|
|
void mark_block(F_BLOCK *block);
|
2007-09-20 18:09:08 -04:00
|
|
|
void unmark_marked(F_HEAP *heap);
|
2009-04-26 10:15:58 -04:00
|
|
|
void free_unmarked(F_HEAP *heap, HEAP_ITERATOR iter);
|
2008-04-07 21:19:49 -04:00
|
|
|
void heap_usage(F_HEAP *heap, CELL *used, CELL *total_free, CELL *max_free);
|
2007-09-20 18:09:08 -04:00
|
|
|
CELL heap_size(F_HEAP *heap);
|
2009-01-24 21:13:17 -05:00
|
|
|
CELL compute_heap_forwarding(F_HEAP *heap);
|
|
|
|
void compact_heap(F_HEAP *heap);
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
INLINE F_BLOCK *next_block(F_HEAP *heap, F_BLOCK *block)
|
|
|
|
{
|
|
|
|
CELL next = ((CELL)block + block->size);
|
|
|
|
if(next == heap->segment->end)
|
|
|
|
return NULL;
|
|
|
|
else
|
|
|
|
return (F_BLOCK *)next;
|
|
|
|
}
|
|
|
|
|
|
|
|
INLINE F_BLOCK *first_block(F_HEAP *heap)
|
|
|
|
{
|
|
|
|
return (F_BLOCK *)heap->segment->start;
|
|
|
|
}
|
|
|
|
|
|
|
|
INLINE F_BLOCK *last_block(F_HEAP *heap)
|
|
|
|
{
|
|
|
|
return (F_BLOCK *)heap->segment->end;
|
|
|
|
}
|