[PATCH] added malloc usable size and test
Joel Sherrill
joel at rtems.org
Tue Mar 15 15:25:12 UTC 2022
On Fri, Mar 4, 2022 at 8:58 PM zack leung <zakthertemsdev at gmail.com> wrote:
> closes #4503
> ---
> cpukit/include/rtems/libcsupport.h | 5 +++
> cpukit/libcsupport/src/mallocusablesize.c | 48 +++++++++++++++++++++++
> spec/build/cpukit/librtemscpu.yml | 1 +
> testsuites/libtests/malloctest/init.c | 15 ++++++-
> 4 files changed, 68 insertions(+), 1 deletion(-)
> create mode 100644 cpukit/libcsupport/src/mallocusablesize.c
>
> diff --git a/cpukit/include/rtems/libcsupport.h
> b/cpukit/include/rtems/libcsupport.h
> index f4be4cfc9a..5110ab0fbe 100644
> --- a/cpukit/include/rtems/libcsupport.h
> +++ b/cpukit/include/rtems/libcsupport.h
> @@ -74,6 +74,11 @@ extern size_t malloc_free_space(void);
> */
> extern int malloc_info(Heap_Information_block *the_info);
>
> +/**
> + * @brief Find the usable size of the block of memory .
> + */
> +extern size_t malloc_usable_size(void *ptr);
> +
>
This should be in newlib's malloc.h to align with how it is done
on Linux. This is an RTEMS specific header file. I went ahead
and posted the patch for this since it was small:
https://sourceware.org/pipermail/newlib/2022/019430.html
> /*
> * Prototypes required to install newlib reentrancy user extension
> */
> diff --git a/cpukit/libcsupport/src/mallocusablesize.c
> b/cpukit/libcsupport/src/mallocusablesize.c
> new file mode 100644
> index 0000000000..b7e573023a
> --- /dev/null
> +++ b/cpukit/libcsupport/src/mallocusablesize.c
> @@ -0,0 +1,48 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (C) 2022 zacchaeus leung
> + *
> + * 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/libcsupport.h>
> +#include <rtems/malloc.h>
> +#include <rtems/score/heapimpl.h>
> +
> +size_t malloc_usable_size( void *ptr ) {
> +
> + Heap_Control *heap_ptr ;
> + size_t size;
> + if ( ptr == NULL ) {
>
Blank line above the if. Space between ) and {
> + return 0;
> + }
> +
> + heap_ptr = malloc_get_heap_pointer();
> + _Heap_Size_of_alloc_area( heap_ptr, ptr, &size );
>
>
This should be _Protected_heap_Get_block_size() to ensure that
locking is performed.
> + return size;
> +}
> diff --git a/spec/build/cpukit/librtemscpu.yml
> b/spec/build/cpukit/librtemscpu.yml
> index c224937348..2ef11e7e2d 100644
> --- a/spec/build/cpukit/librtemscpu.yml
> +++ b/spec/build/cpukit/librtemscpu.yml
> @@ -670,6 +670,7 @@ source:
> - cpukit/libcsupport/src/lseek.c
> - cpukit/libcsupport/src/lstat.c
> - cpukit/libcsupport/src/malloc.c
> +- cpukit/libcsupport/src/mallocusablesize.c
> - cpukit/libcsupport/src/malloc_deferred.c
> - cpukit/libcsupport/src/malloc_dirtier.c
> - cpukit/libcsupport/src/malloc_walk.c
> diff --git a/testsuites/libtests/malloctest/init.c
> b/testsuites/libtests/malloctest/init.c
> index a33764177d..871edb540e 100644
> --- a/testsuites/libtests/malloctest/init.c
> +++ b/testsuites/libtests/malloctest/init.c
> @@ -1362,6 +1362,18 @@ static void test_alloc_zero_size(void)
> rtems_test_assert( p == NULL );
> rtems_test_assert( errno == -1 );
> }
> +static void test_usablesize(void)
>
Blank line above method.
> +{
> + int * a = malloc(sizeof( int )*100);
> + int alloc_size=sizeof( int ) *100 ;
>
Spaces around =
Inconsistent spaces around "*" between those two lines.
> + rtems_test_assert( malloc_usable_size( a ) <= alloc_size +
> CPU_HEAP_ALIGNMENT );
>
Should also be >= alloc_size and <= alloc_size + HEAP_ALIGNMENT.
Needs to be large enough to use.
> + free(a);
> +
> + char * b = malloc(sizeof ( char ) 100);
> + int alloc_size 2= sizeof ( char ) *100 ;
>
Same
> + rtems_test_assert( malloc_usable_size ( b ) <= alloc_size2 +
> CPU_HEAP_ALIGNMENT);
>
Same
> + free( b );
> +}
>
> rtems_task Init(
> rtems_task_argument argument
> @@ -1405,6 +1417,7 @@ rtems_task Init(
> test_protected_heap_info();
> test_rtems_heap_allocate_aligned_with_boundary();
> test_rtems_malloc();
> + test_usablesize();
> test_rtems_calloc();
> test_greedy_allocate();
> test_alloc_zero_size();
> @@ -1524,4 +1537,4 @@ RTEMS_SYSINIT_ITEM(
> test_early_malloc,
> RTEMS_SYSINIT_INITIAL_EXTENSIONS,
> RTEMS_SYSINIT_ORDER_FIRST
> -);
> +);
> \ No newline at end of file
>
Check this one.
If the test directory has a doc file explaining what it is testing,
then testing this new method needs to be added.
This is close. Mostly minor except for the malloc.h patch. For you
locally, just manually edit the installed malloc.h file to have the
prototype.
--joel
--
> 2.35.1
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
More information about the devel
mailing list