libc/minimal: Use a sys_heap for the malloc implementation
The older sys_mem_pool is going away and being replaced by a new
allocator.
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
diff --git a/lib/libc/minimal/source/stdlib/malloc.c b/lib/libc/minimal/source/stdlib/malloc.c
index c3e3314..3ee9e74 100644
--- a/lib/libc/minimal/source/stdlib/malloc.c
+++ b/lib/libc/minimal/source/stdlib/malloc.c
@@ -25,14 +25,15 @@
#define POOL_SECTION .data
#endif /* CONFIG_USERSPACE */
-SYS_MEM_POOL_DEFINE(z_malloc_mem_pool, NULL, 16,
- CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE, 1, 4, POOL_SECTION);
+#define HEAP_BYTES CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE
+
+Z_GENERIC_SECTION(POOL_SECTION) static struct sys_heap z_malloc_heap;
+Z_GENERIC_SECTION(POOL_SECTION) static char z_malloc_heap_mem[HEAP_BYTES];
void *malloc(size_t size)
{
void *ret;
-
- ret = sys_mem_pool_alloc(&z_malloc_mem_pool, size);
+ ret = sys_heap_alloc(&z_malloc_heap, size);
if (ret == NULL) {
errno = ENOMEM;
}
@@ -44,11 +45,23 @@
{
ARG_UNUSED(unused);
- sys_mem_pool_init(&z_malloc_mem_pool);
+ sys_heap_init(&z_malloc_heap, z_malloc_heap_mem, HEAP_BYTES);
return 0;
}
+void *realloc(void *ptr, size_t requested_size)
+{
+ void *ret = sys_heap_realloc(&z_malloc_heap, ptr, requested_size);
+
+ return ret == NULL ? ptr : ret;
+}
+
+void free(void *ptr)
+{
+ sys_heap_free(&z_malloc_heap, ptr);
+}
+
SYS_INIT(malloc_prepare, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
#else /* No malloc arena */
void *malloc(size_t size)
@@ -60,43 +73,19 @@
return NULL;
}
-#endif
-
-void *realloc(void *ptr, size_t requested_size)
-{
- void *new_ptr;
- size_t copy_size;
-
- if (ptr == NULL) {
- return malloc(requested_size);
- }
-
- if (requested_size == 0) {
- free(ptr);
- return NULL;
- }
-
- copy_size = sys_mem_pool_try_expand_inplace(ptr, requested_size);
- if (copy_size == 0) {
- /* Existing block large enough, nothing else to do */
- return ptr;
- }
-
- new_ptr = malloc(requested_size);
- if (new_ptr == NULL) {
- return NULL;
- }
-
- memcpy(new_ptr, ptr, copy_size);
- free(ptr);
-
- return new_ptr;
-}
void free(void *ptr)
{
- sys_mem_pool_free(ptr);
+ ARG_UNUSED(ptr);
}
+
+void *realloc(void *ptr, size_t requested_size)
+{
+ ARG_UNUSED(ptr);
+ return malloc(requested_size);
+}
+#endif
+
#endif /* CONFIG_MINIMAL_LIBC_MALLOC */
#ifdef CONFIG_MINIMAL_LIBC_CALLOC
@@ -122,10 +111,14 @@
#ifdef CONFIG_MINIMAL_LIBC_REALLOCARRAY
void *reallocarray(void *ptr, size_t nmemb, size_t size)
{
+#if (CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE > 0)
if (size_mul_overflow(nmemb, size, &size)) {
errno = ENOMEM;
return NULL;
}
- return realloc(ptr, size);
+ return sys_heap_realloc(&z_malloc_heap, ptr, size);
+#else
+ return NULL;
+#endif
}
#endif /* CONFIG_MINIMAL_LIBC_REALLOCARRAY */