diff --git a/lib/libc/common/source/stdlib/malloc.c b/lib/libc/common/source/stdlib/malloc.c index 50c688fa7f2..a98b3e234d3 100644 --- a/lib/libc/common/source/stdlib/malloc.c +++ b/lib/libc/common/source/stdlib/malloc.c @@ -11,7 +11,9 @@ #include #include #include +#ifdef CONFIG_MULTITHREADING #include +#endif #include #include #include @@ -113,14 +115,31 @@ extern char _heap_sentry[]; # endif /* else ALLOCATE_HEAP_AT_STARTUP */ POOL_SECTION static struct sys_heap z_malloc_heap; + +#ifdef CONFIG_MULTITHREADING MALLOC_SECTION SYS_MUTEX_DEFINE(z_malloc_heap_mutex); -void *malloc(size_t size) -{ +static inline void +malloc_lock(void) { int lock_ret; lock_ret = sys_mutex_lock(&z_malloc_heap_mutex, K_FOREVER); __ASSERT_NO_MSG(lock_ret == 0); +} + +static inline void +malloc_unlock(void) +{ + (void) sys_mutex_unlock(&z_malloc_heap_mutex); +} +#else +#define malloc_lock() +#define malloc_unlock() +#endif + +void *malloc(size_t size) +{ + malloc_lock(); void *ret = sys_heap_aligned_alloc(&z_malloc_heap, __alignof__(z_max_align_t), @@ -129,17 +148,14 @@ void *malloc(size_t size) errno = ENOMEM; } - (void) sys_mutex_unlock(&z_malloc_heap_mutex); + malloc_unlock(); return ret; } void *aligned_alloc(size_t alignment, size_t size) { - int lock_ret; - - lock_ret = sys_mutex_lock(&z_malloc_heap_mutex, K_FOREVER); - __ASSERT_NO_MSG(lock_ret == 0); + malloc_lock(); void *ret = sys_heap_aligned_alloc(&z_malloc_heap, alignment, @@ -148,7 +164,7 @@ void *aligned_alloc(size_t alignment, size_t size) errno = ENOMEM; } - (void) sys_mutex_unlock(&z_malloc_heap_mutex); + malloc_unlock(); return ret; } @@ -222,10 +238,7 @@ static int malloc_prepare(void) void *realloc(void *ptr, size_t requested_size) { - int lock_ret; - - lock_ret = sys_mutex_lock(&z_malloc_heap_mutex, K_FOREVER); - __ASSERT_NO_MSG(lock_ret == 0); + malloc_lock(); void *ret = sys_heap_aligned_realloc(&z_malloc_heap, ptr, __alignof__(z_max_align_t), @@ -235,19 +248,16 @@ void *realloc(void *ptr, size_t requested_size) errno = ENOMEM; } - (void) sys_mutex_unlock(&z_malloc_heap_mutex); + malloc_unlock(); return ret; } void free(void *ptr) { - int lock_ret; - - lock_ret = sys_mutex_lock(&z_malloc_heap_mutex, K_FOREVER); - __ASSERT_NO_MSG(lock_ret == 0); + malloc_lock(); sys_heap_free(&z_malloc_heap, ptr); - (void) sys_mutex_unlock(&z_malloc_heap_mutex); + malloc_unlock(); } SYS_INIT(malloc_prepare, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);