add prev and next block checking in heap_free
This commit is contained in:
parent
dae46bb74d
commit
0570f9fdd9
4 changed files with 8 additions and 7 deletions
2
cutil.c
2
cutil.c
|
|
@ -20,7 +20,7 @@ void* _cu_realloc(void* mem, size_t size)
|
||||||
|
|
||||||
void _cu_free(void* mem)
|
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;
|
void* (*cu_malloc)(size_t) = _cu_malloc;
|
||||||
|
|
|
||||||
9
heap.c
9
heap.c
|
|
@ -55,14 +55,15 @@ mblock_t* heap_alloc(mheap_t* heap, uword _size)
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
void heap_free(mblock_t* block)
|
void heap_free(mheap_t* heap, mblock_t* block)
|
||||||
{
|
{
|
||||||
block->size &= ~MBLOCK_ALLOCATED;
|
block->size &= ~MBLOCK_ALLOCATED;
|
||||||
mblock_t* prev = block->prev;
|
mblock_t* prev = block->prev;
|
||||||
mblock_t* next = (mblock_t*)((u8*)block + block->size);
|
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);
|
heap_join(block, prev);
|
||||||
if (!(next->size & MBLOCK_ALLOCATED))
|
if (next < end && !(next->size & MBLOCK_ALLOCATED))
|
||||||
heap_join(block, next);
|
heap_join(block, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -81,7 +82,7 @@ mblock_t* heap_realloc(mheap_t* heap, mblock_t* block, uword _size)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
heap_free(block);
|
heap_free(heap, block);
|
||||||
new = heap_alloc(heap, size);
|
new = heap_alloc(heap, size);
|
||||||
if (new)
|
if (new)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
2
heap.h
2
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_split(mblock_t* block, uword size);
|
||||||
void heap_join(mblock_t* block, mblock_t* other);
|
void heap_join(mblock_t* block, mblock_t* other);
|
||||||
mblock_t* heap_alloc(mheap_t* heap, uword _size);
|
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);
|
mblock_t* heap_realloc(mheap_t* heap, mblock_t* block, uword _size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
2
test.c
2
test.c
|
|
@ -207,7 +207,7 @@ int main()
|
||||||
void* m1 = heap_alloc(&heap, 8);
|
void* m1 = heap_alloc(&heap, 8);
|
||||||
void* m2 = heap_alloc(&heap, 32);
|
void* m2 = heap_alloc(&heap, 32);
|
||||||
void* m3 = heap_alloc(&heap, 9);
|
void* m3 = heap_alloc(&heap, 9);
|
||||||
heap_free(m2);
|
heap_free(&heap, m2);
|
||||||
void* m4 = heap_alloc(&heap, 8);
|
void* m4 = heap_alloc(&heap, 8);
|
||||||
printf("heap_alloc\t%p\n", m1);
|
printf("heap_alloc\t%p\n", m1);
|
||||||
printf("heap_alloc\t%p\n", m2);
|
printf("heap_alloc\t%p\n", m2);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue