summaryrefslogtreecommitdiff
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-03-09 16:34:15 +0100
commitae9e475d682a764bb872d319b1c784cf06010227 (patch)
treec3f65bee2285d9f934599d48eae4fb500a9b5465
parentec78e0359b1c2ef18954088114b06e1b8582e073 (diff)
libc: Optimize malloc() initialization
Change licence to BSD-2-Clause according to file history.
-rw-r--r--bsps/shared/start/mallocinitmany.c48
-rw-r--r--bsps/shared/start/mallocinitone.c48
-rw-r--r--cpukit/include/rtems/malloc.h8
-rw-r--r--cpukit/include/rtems/mallocinitmany.h97
-rw-r--r--cpukit/include/rtems/mallocinitone.h88
-rw-r--r--cpukit/libcsupport/src/malloc_initialize.c81
-rw-r--r--cpukit/libcsupport/src/mallocheap.c2
-rw-r--r--spec/build/cpukit/librtemscpu.yml1
-rw-r--r--testsuites/libtests/malloc04/init.c37
9 files changed, 306 insertions, 104 deletions
diff --git a/bsps/shared/start/mallocinitmany.c b/bsps/shared/start/mallocinitmany.c
new file mode 100644
index 0000000000..f9fbc49406
--- /dev/null
+++ b/bsps/shared/start/mallocinitmany.c
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief _Malloc_Initialize() Implementation
+ */
+
+/*
+ * Copyright (C) 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/mallocinitmany.h>
+#include <rtems/score/wkspacedata.h>
+
+static Heap_Control _Malloc_Heap;
+
+Heap_Control *_Workspace_Malloc_initialize_separate( void )
+{
+ return _Malloc_Initialize_with_many_areas( &_Malloc_Heap );
+}
diff --git a/bsps/shared/start/mallocinitone.c b/bsps/shared/start/mallocinitone.c
new file mode 100644
index 0000000000..eecb65a6cb
--- /dev/null
+++ b/bsps/shared/start/mallocinitone.c
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief _Malloc_Initialize() Implementation
+ */
+
+/*
+ * Copyright (C) 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/mallocinitone.h>
+#include <rtems/score/wkspacedata.h>
+
+static Heap_Control _Malloc_Heap;
+
+Heap_Control *_Workspace_Malloc_initialize_separate( void )
+{
+ return _Malloc_Initialize_with_one_area( &_Malloc_Heap );
+}
diff --git a/cpukit/include/rtems/malloc.h b/cpukit/include/rtems/malloc.h
index ec6473a703..fc7f3be3ae 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,13 +42,10 @@ extern "C" {
*/
extern Heap_Control *RTEMS_Malloc_Heap;
-Heap_Control *RTEMS_Malloc_Initialize(
- const Memory_Information *mem,
- Heap_Initialization_or_extend_handler extend
-);
-
extern ptrdiff_t RTEMS_Malloc_Sbrk_amount;
+void _Malloc_Initialize( void );
+
static inline void rtems_heap_set_sbrk_amount( ptrdiff_t sbrk_amount )
{
RTEMS_Malloc_Sbrk_amount = sbrk_amount;
diff --git a/cpukit/include/rtems/mallocinitmany.h b/cpukit/include/rtems/mallocinitmany.h
new file mode 100644
index 0000000000..054a746bf2
--- /dev/null
+++ b/cpukit/include/rtems/mallocinitmany.h
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief Malloc Support Initialization API
+ */
+
+/*
+ * 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_MALLOCINITMANY_H
+#define _RTEMS_MALLOCINITMANY_H
+
+#include <rtems/malloc.h>
+#include <rtems/score/heapimpl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup MallocSupport
+ *
+ * @{
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Control *_Malloc_Initialize_with_many_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_MALLOCINITMANY_H */
diff --git a/cpukit/include/rtems/mallocinitone.h b/cpukit/include/rtems/mallocinitone.h
new file mode 100644
index 0000000000..ef9411ca62
--- /dev/null
+++ b/cpukit/include/rtems/mallocinitone.h
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief Malloc Support Initialization API
+ */
+
+/*
+ * 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
+
+/**
+ * @addtogroup MallocSupport
+ *
+ * @{
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Control *_Malloc_Initialize_with_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 */
diff --git a/cpukit/libcsupport/src/malloc_initialize.c b/cpukit/libcsupport/src/malloc_initialize.c
deleted file mode 100644
index fb0999df01..0000000000
--- a/cpukit/libcsupport/src/malloc_initialize.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * @file
- *
- * @brief RTEMS_Malloc_Initialize() implementation.
- */
-
-/*
- * COPYRIGHT (c) 1989-2012.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <rtems/malloc.h>
-#include <rtems/score/wkspace.h>
-
-#include "malloc_p.h"
-
-#ifdef RTEMS_NEWLIB
-static Heap_Control _Malloc_Heap;
-
-Heap_Control *RTEMS_Malloc_Initialize(
- const Memory_Information *mem,
- Heap_Initialization_or_extend_handler extend
-)
-{
- Heap_Control *heap;
- Heap_Initialization_or_extend_handler init_or_extend;
- uintptr_t page_size;
- size_t i;
-
- heap = &_Malloc_Heap;
- 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 = extend;
- }
- }
-
- if ( init_or_extend == _Heap_Initialize ) {
- _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
- }
-
- return heap;
-}
-#else
-Heap_Control *RTEMS_Malloc_Initialize(
- const Memory_Information *mem,
- Heap_Initialization_or_extend_handler extend
-)
-{
- /* FIXME: Dummy function */
- return NULL;
-}
-#endif
-
-Heap_Control *_Workspace_Malloc_initialize_separate( void )
-{
- return RTEMS_Malloc_Initialize( _Memory_Get(), _Heap_Extend );
-}
diff --git a/cpukit/libcsupport/src/mallocheap.c b/cpukit/libcsupport/src/mallocheap.c
index 006362f209..ec14e73763 100644
--- a/cpukit/libcsupport/src/mallocheap.c
+++ b/cpukit/libcsupport/src/mallocheap.c
@@ -44,7 +44,7 @@
Heap_Control *RTEMS_Malloc_Heap;
-static void _Malloc_Initialize( void )
+void _Malloc_Initialize( void )
{
RTEMS_Malloc_Heap = ( *_Workspace_Malloc_initializer )();
}
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index 0d16cea304..a79cfad43c 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -672,7 +672,6 @@ source:
- cpukit/libcsupport/src/malloc.c
- cpukit/libcsupport/src/malloc_deferred.c
- cpukit/libcsupport/src/malloc_dirtier.c
-- cpukit/libcsupport/src/malloc_initialize.c
- cpukit/libcsupport/src/malloc_walk.c
- cpukit/libcsupport/src/mallocdirtydefault.c
- cpukit/libcsupport/src/mallocextenddefault.c
diff --git a/testsuites/libtests/malloc04/init.c b/testsuites/libtests/malloc04/init.c
index 51d318850b..8f05c63a79 100644
--- a/testsuites/libtests/malloc04/init.c
+++ b/testsuites/libtests/malloc04/init.c
@@ -78,16 +78,23 @@ rtems_task Init(
)
{
Heap_Control *real_heap;
- Memory_Area area;
- Memory_Information mem = {
- .count = 1,
- .areas = &area
- };
+ const Memory_Information *mem;
+ Memory_Area *area;
+ size_t i;
void *p;
TEST_BEGIN();
+ mem = _Memory_Get();
+
+ for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
+ area = _Memory_Get_area( mem, i );
+ _Memory_Initialize( area, NULL, NULL );
+ }
+
+ area = _Memory_Get_area( mem, 0 );
+
/* Safe information on real heap */
real_heap = malloc_get_heap_pointer();
malloc_set_heap_pointer( &TempHeap );
@@ -98,8 +105,8 @@ rtems_task Init(
sbrk_count = 0;
offset = 256;
- _Memory_Initialize_by_size( &area, &Malloc_Heap[ 0 ], offset );
- RTEMS_Malloc_Initialize( &mem, NULL );
+ _Memory_Initialize_by_size( area, &Malloc_Heap[ 0 ], offset );
+ _Malloc_Initialize();
errno = 0;
p = malloc( 256 );
@@ -113,8 +120,8 @@ rtems_task Init(
sbrk_count = 0;
offset = 256;
- _Memory_Initialize_by_size( &area, &Malloc_Heap[ 0 ], offset );
- RTEMS_Malloc_Initialize( &mem, NULL );
+ _Memory_Initialize_by_size( area, &Malloc_Heap[ 0 ], offset );
+ _Malloc_Initialize();
p = malloc(1);
rtems_test_assert( p != NULL );
@@ -128,8 +135,8 @@ rtems_task Init(
sbrk_count = 0;
offset = 256;
- _Memory_Initialize_by_size( &area, &Malloc_Heap[ 0 ], offset );
- RTEMS_Malloc_Initialize( &mem, NULL );
+ _Memory_Initialize_by_size( area, &Malloc_Heap[ 0 ], offset );
+ _Malloc_Initialize();
errno = 0;
p = malloc( sizeof( Malloc_Heap ) );
@@ -141,8 +148,8 @@ rtems_task Init(
sbrk_count = 0;
offset = 256;
- _Memory_Initialize_by_size( &area, &Malloc_Heap[ 0 ], offset );
- RTEMS_Malloc_Initialize( &mem, NULL );
+ _Memory_Initialize_by_size( area, &Malloc_Heap[ 0 ], offset );
+ _Malloc_Initialize();
p = malloc( 128 );
rtems_test_assert( p != NULL );
@@ -156,8 +163,8 @@ rtems_task Init(
sbrk_count = -1;
offset = 256;
- _Memory_Initialize_by_size( &area, &Malloc_Heap[ 0 ], offset );
- RTEMS_Malloc_Initialize( &mem, NULL );
+ _Memory_Initialize_by_size( area, &Malloc_Heap[ 0 ], offset );
+ _Malloc_Initialize();
errno = 0;
p = malloc( 256 );