From 4589c369becbd0e7ab9ade912745a932b8e322c2 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sun, 27 Jun 2021 04:57:54 +0800 Subject: [PATCH] arch/sim: Implement mm_mallinfo for the custom heap Signed-off-by: Xiang Xiao --- arch/sim/src/sim/up_heap.c | 1 + arch/sim/src/sim/up_hostmemory.c | 54 +++++++++++++++++++++++++++++++- arch/sim/src/sim/up_internal.h | 1 + 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/arch/sim/src/sim/up_heap.c b/arch/sim/src/sim/up_heap.c index b1ccc1172b3..cd61de484b6 100644 --- a/arch/sim/src/sim/up_heap.c +++ b/arch/sim/src/sim/up_heap.c @@ -427,6 +427,7 @@ void mm_extend(FAR struct mm_heap_s *heap, FAR void *mem, size_t size, int mm_mallinfo(FAR struct mm_heap_s *heap, FAR struct mallinfo *info) { memset(info, 0, sizeof(struct mallinfo)); + host_mallinfo(&info->aordblks, &info->uordblks); return 0; } diff --git a/arch/sim/src/sim/up_hostmemory.c b/arch/sim/src/sim/up_hostmemory.c index f44401103a7..07cad25f53e 100644 --- a/arch/sim/src/sim/up_hostmemory.c +++ b/arch/sim/src/sim/up_hostmemory.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,13 @@ #include "up_internal.h" +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static atomic_int g_aordblks; +static atomic_int g_uordblks; + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -144,15 +152,59 @@ void *host_memalign(size_t alignment, size_t size) return NULL; } + size = host_malloc_size(p); + g_aordblks += 1; + g_uordblks += size; + return p; } void host_free(void *mem) { + size_t size; + + if (mem == NULL) + { + return; + } + + size = host_malloc_size(mem); + g_aordblks -= 1; + g_uordblks -= size; free(mem); } void *host_realloc(void *oldmem, size_t size) { - return realloc(oldmem, size); + size_t oldsize; + void *mem; + + if (size == 0) + { + host_free(oldmem); + return NULL; + } + else if (oldmem == NULL) + { + return host_memalign(sizeof(void *), size); + } + + oldsize = host_malloc_size(oldmem); + mem = realloc(oldmem, size); + if (mem == NULL) + { + return NULL; + } + + size = host_malloc_size(mem); + g_uordblks -= oldsize; + g_uordblks += size; + + return mem; +} + +void host_mallinfo(int *aordblks, int *uordblks) +{ + *aordblks = g_aordblks; + *uordblks = g_uordblks; } diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h index 43c8913fd1c..307d7aa5711 100644 --- a/arch/sim/src/sim/up_internal.h +++ b/arch/sim/src/sim/up_internal.h @@ -148,6 +148,7 @@ size_t host_malloc_size(void *mem); void *host_memalign(size_t alignment, size_t size); void host_free(void *mem); void *host_realloc(void *oldmem, size_t size); +void host_mallinfo(int *aordblks, int *uordblks); /* up_hosttime.c ************************************************************/