You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2021/07/04 21:53:56 UTC

[incubator-nuttx] 04/05: arch/sim: Implement mm_mallinfo for the custom heap

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 <xi...@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 <xi...@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 ************************************************************/