This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 4589c369becbd0e7ab9ade912745a932b8e322c2 Author: Xiang Xiao <xiaoxi...@xiaomi.com> AuthorDate: Sun Jun 27 04:57:54 2021 +0800 arch/sim: Implement mm_mallinfo for the custom heap Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com> --- 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 b1ccc11..cd61de4 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 f444011..07cad25 100644 --- a/arch/sim/src/sim/up_hostmemory.c +++ b/arch/sim/src/sim/up_hostmemory.c @@ -27,6 +27,7 @@ #include <unistd.h> #include <string.h> #include <stdlib.h> +#include <stdatomic.h> #include <sys/mman.h> #include <sys/stat.h> @@ -40,6 +41,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 43c8913..307d7aa 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 ************************************************************/