summaryrefslogtreecommitdiffstats
path: root/cpukit/include
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-04-08 17:14:41 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-11-30 08:33:12 +0100
commitd7205f0083f8fdd0408404ce99c6eab9b8d120c7 (patch)
tree235c9be429a0e1576775079756d81032298305e1 /cpukit/include
parentscore: Optimize Workspace Handler initialization (diff)
downloadrtems-d7205f0083f8fdd0408404ce99c6eab9b8d120c7.tar.bz2
libc: Optimize malloc() initialization
The BSPs provide memory for the separate C Program Heap initialization via _Memory_Get(). Most BSPs provide exactly one memory area. Only two BSPs provide more than one memory area (arm/altera-cyclone-v and bsps/powerpc/mpc55xxevb). Only if more than one memory area is provided, there is a need to use _Heap_Extend(). Provide two implementations to initialize the separate C Program Heap and let the BSP select one of the implementations based on the number of provided memory areas. This gets rid of a dependency on _Heap_Extend(). It also avoids dead code sections for most BSPs. Change licence to BSD-2-Clause according to file history. Update #3053.
Diffstat (limited to 'cpukit/include')
-rw-r--r--cpukit/include/rtems/malloc.h6
-rw-r--r--cpukit/include/rtems/mallocinitmulti.h100
-rw-r--r--cpukit/include/rtems/mallocinitone.h90
3 files changed, 191 insertions, 5 deletions
diff --git a/cpukit/include/rtems/malloc.h b/cpukit/include/rtems/malloc.h
index eba538e223..c0d15fbf72 100644
--- a/cpukit/include/rtems/malloc.h
+++ b/cpukit/include/rtems/malloc.h
@@ -19,7 +19,6 @@
#include <rtems.h>
#include <rtems/bspIo.h>
#include <rtems/libcsupport.h> /* for malloc_walk() */
-#include <rtems/score/memory.h>
#include <stdint.h>
@@ -43,10 +42,7 @@ extern "C" {
*/
extern Heap_Control *RTEMS_Malloc_Heap;
-Heap_Control *RTEMS_Malloc_Initialize(
- const Memory_Information *mem,
- Heap_Initialization_or_extend_handler extend
-);
+void _Malloc_Initialize( void );
void rtems_heap_set_sbrk_amount( ptrdiff_t sbrk_amount );
diff --git a/cpukit/include/rtems/mallocinitmulti.h b/cpukit/include/rtems/mallocinitmulti.h
new file mode 100644
index 0000000000..a64c6e4802
--- /dev/null
+++ b/cpukit/include/rtems/mallocinitmulti.h
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief This header file provides the implementation of
+ * _Malloc_Initialize_for_multiple_areas().
+ */
+
+/*
+ * Copyright (C) 2012, 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTEMS_MALLOCINITMULTI_H
+#define _RTEMS_MALLOCINITMULTI_H
+
+#include <rtems/malloc.h>
+#include <rtems/score/heapimpl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @ingroup MallocSupport
+ *
+ * @brief Initializes the separate C Program Heap with support for more than
+ * one memory area.
+ *
+ * This implementation should be used by BSPs which provide more than one
+ * memory area via _Memory_Get() to implement
+ * _Workspace_Malloc_initialize_separate().
+ */
+RTEMS_INLINE_ROUTINE Heap_Control *_Malloc_Initialize_for_multiple_areas(
+ Heap_Control *heap
+)
+{
+ const Memory_Information *mem;
+ Heap_Initialization_or_extend_handler init_or_extend;
+ uintptr_t page_size;
+ size_t i;
+
+ mem = _Memory_Get();
+ RTEMS_Malloc_Heap = heap;
+ init_or_extend = _Heap_Initialize;
+ page_size = CPU_HEAP_ALIGNMENT;
+
+ for (i = 0; i < _Memory_Get_count( mem ); ++i) {
+ Memory_Area *area;
+ uintptr_t space_available;
+
+ area = _Memory_Get_area( mem, i );
+ space_available = ( *init_or_extend )(
+ heap,
+ _Memory_Get_free_begin( area ),
+ _Memory_Get_free_size( area ),
+ page_size
+ );
+
+ if ( space_available > 0 ) {
+ _Memory_Consume( area, _Memory_Get_free_size( area ) );
+ init_or_extend = _Heap_Extend;
+ }
+ }
+
+ if ( init_or_extend == _Heap_Initialize ) {
+ _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
+ }
+
+ return heap;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTEMS_MALLOCINITMULTI_H */
diff --git a/cpukit/include/rtems/mallocinitone.h b/cpukit/include/rtems/mallocinitone.h
new file mode 100644
index 0000000000..eaa0d8eb3e
--- /dev/null
+++ b/cpukit/include/rtems/mallocinitone.h
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief This header file provides the implementation of
+ * _Malloc_Initialize_for_one_area().
+ */
+
+/*
+ * Copyright (C) 2012, 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTEMS_MALLOCINITONE_H
+#define _RTEMS_MALLOCINITONE_H
+
+#include <rtems/malloc.h>
+#include <rtems/score/assert.h>
+#include <rtems/score/heapimpl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @ingroup MallocSupport
+ *
+ * @brief Initializes the separate C Program Heap with support for exactly one
+ * memory area.
+ *
+ * This implementation should be used by BSPs which provide exactly one memory
+ * area via _Memory_Get() to implement _Workspace_Malloc_initialize_separate().
+ */
+RTEMS_INLINE_ROUTINE Heap_Control *_Malloc_Initialize_for_one_area(
+ Heap_Control *heap
+)
+{
+ const Memory_Information *mem;
+ Memory_Area *area;
+ uintptr_t space_available;
+
+ mem = _Memory_Get();
+ _Assert( _Memory_Get_count( mem ) == 1 );
+
+ RTEMS_Malloc_Heap = heap;
+ area = _Memory_Get_area( mem, 0 );
+ space_available = _Heap_Initialize(
+ heap,
+ _Memory_Get_free_begin( area ),
+ _Memory_Get_free_size( area ),
+ CPU_HEAP_ALIGNMENT
+ );
+
+ if ( space_available > 0 ) {
+ _Memory_Consume( area, _Memory_Get_free_size( area ) );
+ } else {
+ _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
+ }
+
+ return heap;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTEMS_MALLOCINITONE_H */