diff --git a/cutil.c b/cutil.c index e9f1696..4030b98 100644 --- a/cutil.c +++ b/cutil.c @@ -20,7 +20,7 @@ void* _cu_realloc(void* mem, size_t size) void _cu_free(void* mem) { - return heap_free((mblock_t*)((u8*)mem - sizeof(mblock_t))); + return heap_free(&cu_heap, (mblock_t*)((u8*)mem - sizeof(mblock_t))); } void* (*cu_malloc)(size_t) = _cu_malloc; diff --git a/heap.c b/heap.c index 1663178..a415e05 100644 --- a/heap.c +++ b/heap.c @@ -55,14 +55,15 @@ mblock_t* heap_alloc(mheap_t* heap, uword _size) return block; } -void heap_free(mblock_t* block) +void heap_free(mheap_t* heap, mblock_t* block) { block->size &= ~MBLOCK_ALLOCATED; mblock_t* prev = block->prev; mblock_t* next = (mblock_t*)((u8*)block + block->size); - if (!(prev->size & MBLOCK_ALLOCATED)) + mblock_t* end = (mblock_t*)((u8*)heap->start + heap->size); + if (prev && !(prev->size & MBLOCK_ALLOCATED)) heap_join(block, prev); - if (!(next->size & MBLOCK_ALLOCATED)) + if (next < end && !(next->size & MBLOCK_ALLOCATED)) heap_join(block, next); } @@ -81,7 +82,7 @@ mblock_t* heap_realloc(mheap_t* heap, mblock_t* block, uword _size) } else { - heap_free(block); + heap_free(heap, block); new = heap_alloc(heap, size); if (new) { diff --git a/heap.h b/heap.h index 0bd6300..6cd3a01 100644 --- a/heap.h +++ b/heap.h @@ -26,7 +26,7 @@ void heap_init(mheap_t* heap, void* start, uword size); void heap_split(mblock_t* block, uword size); void heap_join(mblock_t* block, mblock_t* other); mblock_t* heap_alloc(mheap_t* heap, uword _size); -void heap_free(mblock_t* block); +void heap_free(mheap_t* heap, mblock_t* block); mblock_t* heap_realloc(mheap_t* heap, mblock_t* block, uword _size); #endif \ No newline at end of file diff --git a/test.c b/test.c index 68a1adf..763d490 100644 --- a/test.c +++ b/test.c @@ -207,7 +207,7 @@ int main() void* m1 = heap_alloc(&heap, 8); void* m2 = heap_alloc(&heap, 32); void* m3 = heap_alloc(&heap, 9); - heap_free(m2); + heap_free(&heap, m2); void* m4 = heap_alloc(&heap, 8); printf("heap_alloc\t%p\n", m1); printf("heap_alloc\t%p\n", m2);