From 1471ea4338dd95ad662343ec8331c3d6eeea6e67 Mon Sep 17 00:00:00 2001 From: James Benton Date: Wed, 13 Jun 2018 18:38:53 +0100 Subject: [PATCH] Change wutnewlib to implement malloc family of functions. This allows us to forward them straight to default heap functions, this is better than having to allocate a fixed heap for sbrk as it allows people to better mix usage malloc & default heap functions. --- libraries/wutnewlib/CMakeLists.txt | 1 + libraries/wutnewlib/wut_malloc.c | 88 ++++++++++++++++++++++++++++++ libraries/wutnewlib/wut_sbrk.c | 18 +++--- 3 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 libraries/wutnewlib/wut_malloc.c diff --git a/libraries/wutnewlib/CMakeLists.txt b/libraries/wutnewlib/CMakeLists.txt index 9b011d9..a66ae03 100644 --- a/libraries/wutnewlib/CMakeLists.txt +++ b/libraries/wutnewlib/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(wutnewlib wut_clock.c wut_gettod_r.c wut_lock.c + wut_malloc.c wut_malloc_lock.c wut_nanosleep.c wut_newlib.c diff --git a/libraries/wutnewlib/wut_malloc.c b/libraries/wutnewlib/wut_malloc.c new file mode 100644 index 0000000..2d960de --- /dev/null +++ b/libraries/wutnewlib/wut_malloc.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +void * +_malloc_r(struct _reent *r, size_t size) +{ + return MEMAllocFromDefaultHeap(size); +} + +void +_free_r(struct _reent *r, void *ptr) +{ + MEMFreeToDefaultHeap(ptr); +} + +void * +_realloc_r(struct _reent *r, void *ptr, size_t size) +{ + void *new_ptr = _malloc_r(r, size); + if (!ptr || !new_ptr) { + return new_ptr; + } + + memcpy(new_ptr, ptr, MEMGetSizeForMBlockExpHeap(ptr)); + _free_r(r, ptr); + return new_ptr; +} + +void * +_calloc_r(struct _reent *r, size_t num, size_t size) +{ + void *ptr = _malloc_r(r, num * size); + if (ptr) { + memset(ptr, 0, num * size); + } + + return ptr; +} + +void * +_memalign_r(struct _reent *r, size_t align, size_t size) +{ + return MEMAllocFromDefaultHeapEx(size, align); +} + +struct mallinfo _mallinfo_r(struct _reent *r) +{ + struct mallinfo info = { 0 }; + return info; +} + +void +_malloc_stats_r(struct _reent *r) +{ +} + +int +_mallopt_r(struct _reent *r, int param, int value) +{ + return 0; +} + +size_t +_malloc_usable_size_r(struct _reent *r, void *ptr) +{ + return MEMGetSizeForMBlockExpHeap(ptr); +} + +void * +_valloc_r(struct _reent *r, size_t size) +{ + return _memalign_r(r, OS_PAGE_SIZE, size); +} + +void * +_pvalloc_r(struct _reent *r, size_t size) +{ + return _memalign_r(r, OS_PAGE_SIZE, (size + (OS_PAGE_SIZE - 1)) & ~(OS_PAGE_SIZE - 1)); +} + +int +_malloc_trim_r(struct _reent *r, size_t pad) +{ + return 0; +} diff --git a/libraries/wutnewlib/wut_sbrk.c b/libraries/wutnewlib/wut_sbrk.c index 4663396..ec0e612 100644 --- a/libraries/wutnewlib/wut_sbrk.c +++ b/libraries/wutnewlib/wut_sbrk.c @@ -1,11 +1,10 @@ #include "wut_newlib.h" #include -#include -#include +#include static uint8_t *sHeapBase = NULL; -static uint32_t sHeapMaxSize = 0; +static uint32_t sHeapMaxSize = 128 * 1024; static volatile uint32_t sHeapSize = 0; void * @@ -30,17 +29,16 @@ __wut_sbrk_r(struct _reent *r, void __init_wut_sbrk_heap() { - MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM2); - uint32_t freeSize = MEMGetAllocatableSizeForExpHeapEx(heap, 0x1000); - - sHeapMaxSize = (uint32_t)(0.9f * (float)freeSize) & ~0xFFF; - sHeapBase = (uint8_t *)MEMAllocFromExpHeapEx(heap, sHeapMaxSize, 0x1000); + sHeapMaxSize = 128 * 1024; + sHeapBase = (uint8_t *)MEMAllocFromDefaultHeap(sHeapMaxSize); sHeapSize = 0; } void __fini_wut_sbrk_heap() { - MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM2); - MEMFreeToExpHeap(heap, sHeapBase); + MEMFreeToDefaultHeap(sHeapBase); + sHeapBase = NULL; + sHeapSize = 0; + sHeapMaxSize = 0; }