diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-11-09 12:11:11 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-11-12 13:26:22 +0100 |
commit | 6efc831f0ff3d975fa9086a46c3a67b6f2b95100 (patch) | |
tree | 0abb96a9bac37a9a07470d7645ef74139fd9738a /cpukit | |
parent | score: Add and use malloc() family attributes (diff) | |
download | rtems-6efc831f0ff3d975fa9086a46c3a67b6f2b95100.tar.bz2 |
Add rtems_malloc() and rtems_calloc()
Close #3583.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/include/rtems/malloc.h | 33 | ||||
-rw-r--r-- | cpukit/libcsupport/src/malloc_deferred.c | 25 |
2 files changed, 58 insertions, 0 deletions
diff --git a/cpukit/include/rtems/malloc.h b/cpukit/include/rtems/malloc.h index a6cfeb574f..6fdab3d02f 100644 --- a/cpukit/include/rtems/malloc.h +++ b/cpukit/include/rtems/malloc.h @@ -142,6 +142,39 @@ void *rtems_heap_allocate_aligned_with_boundary( RTEMS_WARN_UNUSED_RESULT; /** + * @brief Allocates a memory area of the specified size from the heap. + * + * This function is almost identical to malloc(). The only exception is that + * errno is not set in case of a memory allocation failure. + * + * @param[in] size The memory area size in bytes. + * + * @retval NULL The memory allocation failed or @a size is zero. + * @retval otherwise The begin address of the allocated memory area. + */ +void *rtems_malloc(size_t size) + RTEMS_MALLOCLIKE RTEMS_ALLOC_SIZE(1) RTEMS_WARN_UNUSED_RESULT; + +/** + * @brief Allocates a memory area for the specified count of elements from the + * heap. + * + * The allocated memory area is fully filled with zero bits. + * + * This function is almost identical to calloc(). The only exception is that + * errno is not set in case of a memory allocation failure. + * + * @param[in] nelem The count of elements. + * @param[in] elsize The size of each elements. + * + * @retval NULL The memory allocation failed or @a nelem is zero or @a elsize + * is zero. + * @retval otherwise The begin address of the allocated memory area. + */ +void *rtems_calloc(size_t nelem, size_t elsize) + RTEMS_MALLOCLIKE RTEMS_ALLOC_SIZE_2(1, 2) RTEMS_WARN_UNUSED_RESULT; + +/** * @brief Extends the memory available for the heap using the memory area * starting at @a area_begin of size @a area_size bytes. * diff --git a/cpukit/libcsupport/src/malloc_deferred.c b/cpukit/libcsupport/src/malloc_deferred.c index f37b852cba..ccb8dc3b8b 100644 --- a/cpukit/libcsupport/src/malloc_deferred.c +++ b/cpukit/libcsupport/src/malloc_deferred.c @@ -23,6 +23,7 @@ #ifdef RTEMS_NEWLIB #include <stdlib.h> +#include <string.h> #include "malloc_p.h" @@ -136,4 +137,28 @@ void _Malloc_Deferred_free( void *p ) rtems_chain_append_unprotected( &_Malloc_GC_list, node ); rtems_interrupt_lock_release( &_Malloc_GC_lock, &lock_context ); } + +void *rtems_malloc( size_t size ) +{ + if ( size == 0 ) { + return NULL; + } + + return rtems_heap_allocate_aligned_with_boundary( size, 0, 0 ); +} + +void *rtems_calloc( size_t nelem, size_t elsize ) +{ + size_t length; + void *p; + + length = nelem * elsize; + p = rtems_malloc( length ); + RTEMS_OBFUSCATE_VARIABLE( p ); + if ( RTEMS_PREDICT_FALSE( p == NULL ) ) { + return p; + } + + return memset( p, 0, length ); +} #endif |