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>
This commit is contained in:
Andy Ross 2020-10-21 13:25:59 -07:00 committed by Anas Nashif
commit 40016a6a92

View file

@ -25,14 +25,15 @@ K_APPMEM_PARTITION_DEFINE(z_malloc_partition);
#define POOL_SECTION .data #define POOL_SECTION .data
#endif /* CONFIG_USERSPACE */ #endif /* CONFIG_USERSPACE */
SYS_MEM_POOL_DEFINE(z_malloc_mem_pool, NULL, 16, #define HEAP_BYTES CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE
CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE, 1, 4, POOL_SECTION);
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 *malloc(size_t size)
{ {
void *ret; void *ret;
ret = sys_heap_alloc(&z_malloc_heap, size);
ret = sys_mem_pool_alloc(&z_malloc_mem_pool, size);
if (ret == NULL) { if (ret == NULL) {
errno = ENOMEM; errno = ENOMEM;
} }
@ -44,11 +45,23 @@ static int malloc_prepare(const struct device *unused)
{ {
ARG_UNUSED(unused); 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; 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); SYS_INIT(malloc_prepare, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
#else /* No malloc arena */ #else /* No malloc arena */
void *malloc(size_t size) void *malloc(size_t size)
@ -60,43 +73,19 @@ void *malloc(size_t size)
return NULL; 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) 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 */ #endif /* CONFIG_MINIMAL_LIBC_MALLOC */
#ifdef CONFIG_MINIMAL_LIBC_CALLOC #ifdef CONFIG_MINIMAL_LIBC_CALLOC
@ -122,10 +111,14 @@ void *calloc(size_t nmemb, size_t size)
#ifdef CONFIG_MINIMAL_LIBC_REALLOCARRAY #ifdef CONFIG_MINIMAL_LIBC_REALLOCARRAY
void *reallocarray(void *ptr, size_t nmemb, size_t size) 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)) { if (size_mul_overflow(nmemb, size, &size)) {
errno = ENOMEM; errno = ENOMEM;
return NULL; return NULL;
} }
return realloc(ptr, size); return sys_heap_realloc(&z_malloc_heap, ptr, size);
#else
return NULL;
#endif
} }
#endif /* CONFIG_MINIMAL_LIBC_REALLOCARRAY */ #endif /* CONFIG_MINIMAL_LIBC_REALLOCARRAY */