From ebef59e3da9b895f87c5e71ff3150a59ffe4827c Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Wed, 18 May 2022 06:32:22 +0300 Subject: [PATCH] implement heap_realloc --- heap.c | 14 ++++++++++++++ heap.h | 1 + test.c | 2 ++ 3 files changed, 17 insertions(+) diff --git a/heap.c b/heap.c index b5c9eba..6d0edc1 100644 --- a/heap.c +++ b/heap.c @@ -1,4 +1,5 @@ #include "heap.h" +#include "cutil.h" static mblock_t* mblock_get_next(mblock_t* block) { @@ -111,6 +112,19 @@ void* heap_alloc(mheap_t* heap, size_t size) return block->data; } +void* heap_realloc(mheap_t* heap, void* mem, size_t size) +{ + mblock_t* block = (mblock_t*)((u8*)mem - MBLOCK_SIZE); + (void)heap; + + heap_free(heap, mem); + void* newMem = heap_alloc(heap, size); + if (mem != newMem) + cu_memcpy(newMem, mem, mblock_get_size(block)); + + return newMem; +} + void heap_free(mheap_t* heap, void* mem) { mblock_t* block = (mblock_t*)((u8*)mem - MBLOCK_SIZE); diff --git a/heap.h b/heap.h index 12c6116..1bb3f7d 100644 --- a/heap.h +++ b/heap.h @@ -29,6 +29,7 @@ void heap_init(mheap_t* heap, void* data, uword size); void heap_join(mblock_t* start, int dir); void heap_split(mblock_t* block, size_t req_size); void* heap_alloc(mheap_t* heap, size_t size); +void* heap_realloc(mheap_t* heap, void* mem, size_t size); void heap_free(mheap_t* heap, void* mem); #endif \ No newline at end of file diff --git a/test.c b/test.c index 2c52092..8655a7a 100644 --- a/test.c +++ b/test.c @@ -200,6 +200,8 @@ int main() printf("heap_alloc\t%p\n", m2); printf("heap_alloc\t%p\n", m3); printf("heap_alloc\t%p\n", m4); + void* m5 = heap_realloc(&heap, m4, 10); + printf("heap_realloc\t%p\t%p\n", m4, m5); cutil_exit(); return 0;