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:
parent
40c1b55cc2
commit
40016a6a92
1 changed files with 32 additions and 39 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue