On Tue, Mar 15, 2022 at 10:25 AM Joel Sherrill <[email protected]> wrote:
> > > On Fri, Mar 4, 2022 at 8:58 PM zack leung <[email protected]> > 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 > Prototype is already in malloc.h which is included in your tools. Do not modify libcsupport.h and just include <malloc.h> > > > >> /* >> * 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 >> [email protected] >> http://lists.rtems.org/mailman/listinfo/devel >> > _______________________________________________ devel mailing list [email protected] http://lists.rtems.org/mailman/listinfo/devel
