[PATCH 5/5] libc: Optimize malloc() initialization

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Nov 29 10:29:26 UTC 2021


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.
---
 bsps/shared/start/mallocinitmany.c            |  49 +++++++++
 bsps/shared/start/mallocinitone.c             |  49 +++++++++
 cpukit/include/rtems/malloc.h                 |   6 +-
 cpukit/include/rtems/mallocinitmany.h         | 100 ++++++++++++++++++
 cpukit/include/rtems/mallocinitone.h          |  90 ++++++++++++++++
 cpukit/libcsupport/src/malloc_initialize.c    |  81 --------------
 cpukit/libcsupport/src/mallocheap.c           |   2 +-
 .../altera-cyclone-v/bspalteracyclonev.yml    |   1 +
 spec/build/bsps/i386/pc386/obj.yml            |   1 +
 spec/build/bsps/objmem.yml                    |   1 +
 spec/build/bsps/powerpc/mpc55xxevb/obj.yml    |   1 +
 spec/build/bsps/powerpc/objmem.yml            |   1 +
 spec/build/bsps/powerpc/tqm8xx/obj.yml        |   1 +
 spec/build/bsps/sparc/objmem.yml              |   1 +
 spec/build/cpukit/librtemscpu.yml             |   1 -
 testsuites/libtests/malloc04/init.c           |  37 ++++---
 16 files changed, 319 insertions(+), 103 deletions(-)
 create mode 100644 bsps/shared/start/mallocinitmany.c
 create mode 100644 bsps/shared/start/mallocinitone.c
 create mode 100644 cpukit/include/rtems/mallocinitmany.h
 create mode 100644 cpukit/include/rtems/mallocinitone.h
 delete mode 100644 cpukit/libcsupport/src/malloc_initialize.c

diff --git a/bsps/shared/start/mallocinitmany.c b/bsps/shared/start/mallocinitmany.c
new file mode 100644
index 0000000000..afe4ad5fdb
--- /dev/null
+++ b/bsps/shared/start/mallocinitmany.c
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief This source file contains the _Workspace_Malloc_initialize_separate()
+ *   implementation which supports more than one memory area.
+ */
+
+/*
+ * 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_for_many_areas( &_Malloc_Heap );
+}
diff --git a/bsps/shared/start/mallocinitone.c b/bsps/shared/start/mallocinitone.c
new file mode 100644
index 0000000000..249f0b8e02
--- /dev/null
+++ b/bsps/shared/start/mallocinitone.c
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup MallocSupport
+ *
+ * @brief This source file contains the _Workspace_Malloc_initialize_separate()
+ *   implementation which supports exactly one memory area.
+ */
+
+/*
+ * 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_for_one_area( &_Malloc_Heap );
+}
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/mallocinitmany.h b/cpukit/include/rtems/mallocinitmany.h
new file mode 100644
index 0000000000..ffd8439fbb
--- /dev/null
+++ b/cpukit/include/rtems/mallocinitmany.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_many_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_MALLOCINITMANY_H
+#define _RTEMS_MALLOCINITMANY_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_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..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 */
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/bsps/arm/altera-cyclone-v/bspalteracyclonev.yml b/spec/build/bsps/arm/altera-cyclone-v/bspalteracyclonev.yml
index 7fe74074f2..fdaa7f7455 100644
--- a/spec/build/bsps/arm/altera-cyclone-v/bspalteracyclonev.yml
+++ b/spec/build/bsps/arm/altera-cyclone-v/bspalteracyclonev.yml
@@ -139,6 +139,7 @@ source:
 - bsps/shared/irq/irq-default-handler.c
 - bsps/shared/start/bsp-fdt.c
 - bsps/shared/start/gettargethash-default.c
+- bsps/shared/start/mallocinitmany.c
 - bsps/shared/start/sbrk.c
 - bsps/shared/start/stackalloc.c
 - bsps/shared/start/wkspaceinitmany.c
diff --git a/spec/build/bsps/i386/pc386/obj.yml b/spec/build/bsps/i386/pc386/obj.yml
index 692e2df1cc..308dbe5ea9 100644
--- a/spec/build/bsps/i386/pc386/obj.yml
+++ b/spec/build/bsps/i386/pc386/obj.yml
@@ -80,6 +80,7 @@ source:
 - bsps/shared/irq/irq-default-handler.c
 - bsps/shared/start/bspfatal-default.c
 - bsps/shared/start/gettargethash-default.c
+- bsps/shared/start/mallocinitone.c
 - bsps/shared/start/sbrk.c
 - bsps/shared/start/wkspaceinitone.c
 type: build
diff --git a/spec/build/bsps/objmem.yml b/spec/build/bsps/objmem.yml
index 6c72bc3f65..ff6a0937f1 100644
--- a/spec/build/bsps/objmem.yml
+++ b/spec/build/bsps/objmem.yml
@@ -11,5 +11,6 @@ install: []
 links: []
 source:
 - bsps/shared/start/bspgetworkarea-default.c
+- bsps/shared/start/mallocinitone.c
 - bsps/shared/start/wkspaceinitone.c
 type: build
diff --git a/spec/build/bsps/powerpc/mpc55xxevb/obj.yml b/spec/build/bsps/powerpc/mpc55xxevb/obj.yml
index 0eadb0e28d..bb2bb1b8be 100644
--- a/spec/build/bsps/powerpc/mpc55xxevb/obj.yml
+++ b/spec/build/bsps/powerpc/mpc55xxevb/obj.yml
@@ -94,6 +94,7 @@ source:
 - bsps/shared/irq/irq-default-handler.c
 - bsps/shared/start/bspfatal-default.c
 - bsps/shared/start/gettargethash-default.c
+- bsps/shared/start/mallocinitmany.c
 - bsps/shared/start/stackalloc.c
 - bsps/shared/start/wkspaceinitmany.c
 type: build
diff --git a/spec/build/bsps/powerpc/objmem.yml b/spec/build/bsps/powerpc/objmem.yml
index 1fbb8b4fb0..3ef079ee72 100644
--- a/spec/build/bsps/powerpc/objmem.yml
+++ b/spec/build/bsps/powerpc/objmem.yml
@@ -11,5 +11,6 @@ install: []
 links: []
 source:
 - bsps/powerpc/shared/start/bspgetworkarea.c
+- bsps/shared/start/mallocinitone.c
 - bsps/shared/start/wkspaceinitone.c
 type: build
diff --git a/spec/build/bsps/powerpc/tqm8xx/obj.yml b/spec/build/bsps/powerpc/tqm8xx/obj.yml
index 7aec916350..360e99c864 100644
--- a/spec/build/bsps/powerpc/tqm8xx/obj.yml
+++ b/spec/build/bsps/powerpc/tqm8xx/obj.yml
@@ -46,6 +46,7 @@ source:
 - bsps/shared/start/bspfatal-default.c
 - bsps/shared/start/bspreset-empty.c
 - bsps/shared/start/gettargethash-default.c
+- bsps/shared/start/mallocinitone.c
 - bsps/shared/start/sbrk.c
 - bsps/shared/start/wkspaceinitone.c
 type: build
diff --git a/spec/build/bsps/sparc/objmem.yml b/spec/build/bsps/sparc/objmem.yml
index d4ded7b226..071a7473b4 100644
--- a/spec/build/bsps/sparc/objmem.yml
+++ b/spec/build/bsps/sparc/objmem.yml
@@ -10,6 +10,7 @@ includes: []
 install: []
 links: []
 source:
+- bsps/shared/start/mallocinitone.c
 - bsps/shared/start/wkspaceinitone.c
 - bsps/sparc/shared/start/bspgetworkarea.c
 type: build
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index b6b3a09c2b..319ea26e4d 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -675,7 +675,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 );
-- 
2.31.1



More information about the devel mailing list