File indexing completed on 2025-05-11 08:24:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems.h>
0033 #include <rtems/score/heapimpl.h>
0034
0035 #include <string.h>
0036
0037 #include <rtems/test.h>
0038 #include <rtems/test-info.h>
0039
0040 const char rtems_test_name[] = "SPUNLIMITED 1";
0041
0042 void __real__Workspace_Free( void * );
0043 void __wrap__Workspace_Free( void * );
0044
0045 void __wrap__Workspace_Free( void *ptr )
0046 {
0047 uintptr_t alloc_begin;
0048 uintptr_t block_size;
0049 uintptr_t block_end;
0050 Heap_Block *block;
0051
0052 if ( ptr == NULL ) {
0053 return;
0054 }
0055
0056 alloc_begin = (uintptr_t) ptr;
0057 block = _Heap_Block_of_alloc_area( alloc_begin, CPU_HEAP_ALIGNMENT );
0058 block_size = _Heap_Block_size( block );
0059 block_end = (uintptr_t) block + block_size;
0060 memset( ptr, 0, block_end - alloc_begin );
0061
0062 __real__Workspace_Free( ptr );
0063 }
0064
0065 static void delete_mutex( rtems_id id )
0066 {
0067 rtems_status_code sc;
0068
0069 sc = rtems_semaphore_delete( id );
0070 T_rsc_success( sc );
0071 }
0072
0073 T_TEST_CASE( UnlimitedShrink )
0074 {
0075 rtems_id ids[ 6 ];
0076 size_t i;
0077 rtems_status_code sc;
0078
0079 for ( i = 0; i < RTEMS_ARRAY_SIZE( ids ); ++i ) {
0080 sc = rtems_semaphore_create(
0081 rtems_build_name( 'M', 'U', 'T', 'X' ),
0082 1,
0083 RTEMS_BINARY_SEMAPHORE,
0084 0,
0085 &ids[ i ]
0086 );
0087 T_assert_rsc_success( sc );
0088 }
0089
0090 sc = rtems_semaphore_obtain( ids[ 2 ], RTEMS_WAIT, RTEMS_NO_TIMEOUT );
0091 T_rsc_success( sc );
0092
0093 delete_mutex( ids[ 5 ] );
0094 delete_mutex( ids[ 4 ] );
0095 delete_mutex( ids[ 3 ] );
0096
0097 sc = rtems_semaphore_release( ids[ 2 ] );
0098 T_rsc_success( sc );
0099
0100 delete_mutex( ids[ 2 ] );
0101 delete_mutex( ids[ 1 ] );
0102 delete_mutex( ids[ 0 ] );
0103 }
0104
0105 static rtems_task Init( rtems_task_argument argument )
0106 {
0107 rtems_test_run( argument, TEST_STATE );
0108 }
0109
0110 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0111 #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
0112
0113 #define CONFIGURE_MAXIMUM_TASKS 1
0114
0115 #define CONFIGURE_MAXIMUM_SEMAPHORES rtems_resource_unlimited( 2 )
0116
0117 #define CONFIGURE_UNIFIED_WORK_AREAS
0118
0119 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0120
0121 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0122
0123 #define CONFIGURE_INIT
0124
0125 #include <rtems/confdefs.h>