diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/libcsupport/include/rtems/malloc.h | 10 | ||||
-rw-r--r-- | cpukit/libcsupport/src/rtems_heap_greedy.c | 7 | ||||
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/support.h | 10 | ||||
-rw-r--r-- | cpukit/rtems/src/workspacegreedy.c | 7 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/heap.h | 8 | ||||
-rw-r--r-- | cpukit/score/src/heapgreedy.c | 33 | ||||
-rw-r--r-- | testsuites/fstests/fsimfsgeneric01/init.c | 2 | ||||
-rw-r--r-- | testsuites/libtests/block11/init.c | 10 | ||||
-rw-r--r-- | testsuites/libtests/devfs02/init.c | 2 | ||||
-rw-r--r-- | testsuites/psxtests/psxchroot01/test.c | 8 | ||||
-rw-r--r-- | testsuites/psxtests/psximfs02/init.c | 25 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey01/init.c | 2 | ||||
-rw-r--r-- | testsuites/psxtests/psxmsgq02/init.c | 2 | ||||
-rw-r--r-- | testsuites/psxtests/psxobj01/init.c | 2 | ||||
-rw-r--r-- | testsuites/sptests/spfatal22/testcase.h | 2 | ||||
-rw-r--r-- | testsuites/sptests/spprivenv01/init.c | 4 |
16 files changed, 88 insertions, 46 deletions
diff --git a/cpukit/libcsupport/include/rtems/malloc.h b/cpukit/libcsupport/include/rtems/malloc.h index 7f56a842e5..d178e8a00d 100644 --- a/cpukit/libcsupport/include/rtems/malloc.h +++ b/cpukit/libcsupport/include/rtems/malloc.h @@ -186,12 +186,16 @@ rtems_status_code rtems_heap_extend( /** * @brief Greedy allocate that empties the heap. * - * Afterward the heap has at most @a remaining_free_space free space left in - * one free block. All other blocks are used. + * Afterward the heap has at most @a block_count allocateable blocks of sizes + * specified by @a block_sizes. The @a block_sizes must point to an array with + * @a block_count members. All other blocks are used. * * @see rtems_heap_greedy_free(). */ -void *rtems_heap_greedy_allocate( size_t remaining_free_space ); +void *rtems_heap_greedy_allocate( + const uintptr_t *block_sizes, + size_t block_count +); /** * @brief Frees space of a greedy allocation. diff --git a/cpukit/libcsupport/src/rtems_heap_greedy.c b/cpukit/libcsupport/src/rtems_heap_greedy.c index d363fe4d3b..7e5dc16e7e 100644 --- a/cpukit/libcsupport/src/rtems_heap_greedy.c +++ b/cpukit/libcsupport/src/rtems_heap_greedy.c @@ -18,12 +18,15 @@ #include "malloc_p.h" -void *rtems_heap_greedy_allocate( size_t remaining_free_space ) +void *rtems_heap_greedy_allocate( + const uintptr_t *block_sizes, + size_t block_count +) { void *opaque; _RTEMS_Lock_allocator(); - opaque = _Heap_Greedy_allocate( RTEMS_Malloc_Heap, remaining_free_space ); + opaque = _Heap_Greedy_allocate( RTEMS_Malloc_Heap, block_sizes, block_count ); _RTEMS_Unlock_allocator(); return opaque; diff --git a/cpukit/rtems/include/rtems/rtems/support.h b/cpukit/rtems/include/rtems/rtems/support.h index bdabc59e8b..b2c6471c31 100644 --- a/cpukit/rtems/include/rtems/rtems/support.h +++ b/cpukit/rtems/include/rtems/rtems/support.h @@ -102,12 +102,16 @@ bool rtems_workspace_free( /** * @brief Greedy allocate that empties the workspace. * - * Afterward the workspace has at most @a remaining_free_space free space left - * in one free block. All other blocks are used. + * Afterward the heap has at most @a block_count allocateable blocks of sizes + * specified by @a block_sizes. The @a block_sizes must point to an array with + * @a block_count members. All other blocks are used. * * @see rtems_workspace_greedy_free(). */ -void *rtems_workspace_greedy_allocate( size_t remaining_free_space ); +void *rtems_workspace_greedy_allocate( + const uintptr_t *block_sizes, + size_t block_count +); /** * @brief Frees space of a greedy allocation. diff --git a/cpukit/rtems/src/workspacegreedy.c b/cpukit/rtems/src/workspacegreedy.c index 6d8fd9b937..03781412b2 100644 --- a/cpukit/rtems/src/workspacegreedy.c +++ b/cpukit/rtems/src/workspacegreedy.c @@ -19,12 +19,15 @@ #include <rtems/rtems/support.h> #include <rtems/score/wkspace.h> -void *rtems_workspace_greedy_allocate( size_t remaining_free_space ) +void *rtems_workspace_greedy_allocate( + const uintptr_t *block_sizes, + size_t block_count +) { void *opaque; _Thread_Disable_dispatch(); - opaque = _Heap_Greedy_allocate( &_Workspace_Area, remaining_free_space ); + opaque = _Heap_Greedy_allocate( &_Workspace_Area, block_sizes, block_count ); _Thread_Enable_dispatch(); return opaque; diff --git a/cpukit/score/include/rtems/score/heap.h b/cpukit/score/include/rtems/score/heap.h index 9208d17ef4..8e6220cc2e 100644 --- a/cpukit/score/include/rtems/score/heap.h +++ b/cpukit/score/include/rtems/score/heap.h @@ -549,14 +549,16 @@ void _Heap_Iterate( /** * @brief Greedy allocate that empties the heap. * - * Afterward the heap has at most @a remaining_free_space free space left in - * one free block. All other blocks are used. + * Afterward the heap has at most @a block_count allocateable blocks of sizes + * specified by @a block_sizes. The @a block_sizes must point to an array with + * @a block_count members. All other blocks are used. * * @see _Heap_Greedy_free(). */ Heap_Block *_Heap_Greedy_allocate( Heap_Control *heap, - uintptr_t remaining_free_space + const uintptr_t *block_sizes, + size_t block_count ); /** diff --git a/cpukit/score/src/heapgreedy.c b/cpukit/score/src/heapgreedy.c index 4b38b7858a..4711bd5833 100644 --- a/cpukit/score/src/heapgreedy.c +++ b/cpukit/score/src/heapgreedy.c @@ -20,17 +20,31 @@ Heap_Block *_Heap_Greedy_allocate( Heap_Control *heap, - uintptr_t remaining_free_space + const uintptr_t *block_sizes, + size_t block_count ) { - void *free_space = remaining_free_space > 0 ? - _Heap_Allocate( heap, remaining_free_space ) - : NULL; Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); - Heap_Block *current = _Heap_Free_list_first( heap ); + Heap_Block *allocated_blocks = NULL; Heap_Block *blocks = NULL; + Heap_Block *current; + size_t i; - while ( current != free_list_tail ) { + for (i = 0; i < block_count; ++i) { + void *next = _Heap_Allocate( heap, block_sizes [i] ); + + if ( next != NULL ) { + Heap_Block *next_block = _Heap_Block_of_alloc_area( + (uintptr_t) next, + heap->page_size + ); + + next_block->next = allocated_blocks; + allocated_blocks = next_block; + } + } + + while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) { _Heap_Block_allocate( heap, current, @@ -40,10 +54,13 @@ Heap_Block *_Heap_Greedy_allocate( current->next = blocks; blocks = current; - current = _Heap_Free_list_first( heap ); } - _Heap_Free( heap, free_space ); + while ( allocated_blocks != NULL ) { + current = allocated_blocks; + allocated_blocks = allocated_blocks->next; + _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) ); + } return blocks; } diff --git a/testsuites/fstests/fsimfsgeneric01/init.c b/testsuites/fstests/fsimfsgeneric01/init.c index d7abad3ee2..9fd4bad43a 100644 --- a/testsuites/fstests/fsimfsgeneric01/init.c +++ b/testsuites/fstests/fsimfsgeneric01/init.c @@ -367,7 +367,7 @@ static void test_imfs_make_generic_node_errors(void) rtems_test_assert(errno == ENOTSUP); mt_entry->type = type; - opaque = rtems_heap_greedy_allocate(0); + opaque = rtems_heap_greedy_allocate(NULL, 0); errno = 0; rv = IMFS_make_generic_node( path, diff --git a/testsuites/libtests/block11/init.c b/testsuites/libtests/block11/init.c index 095d8bdf2d..b850aba950 100644 --- a/testsuites/libtests/block11/init.c +++ b/testsuites/libtests/block11/init.c @@ -229,6 +229,8 @@ static void test_blkdev_imfs_parameters(void) static void test_blkdev_imfs_errors(void) { + static uintptr_t disk_size [] = { sizeof(rtems_disk_device) + sizeof(int) }; + rtems_status_code sc; int rv; ramdisk *rd; @@ -257,7 +259,7 @@ static void test_blkdev_imfs_errors(void) ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); - opaque = rtems_heap_greedy_allocate(0); + opaque = rtems_heap_greedy_allocate(NULL, 0); sc = rtems_blkdev_create( rda, BLOCK_SIZE, @@ -268,7 +270,7 @@ static void test_blkdev_imfs_errors(void) rtems_test_assert(sc == RTEMS_NO_MEMORY); rtems_heap_greedy_free(opaque); - opaque = rtems_heap_greedy_allocate(sizeof(rtems_disk_device) + sizeof(int)); + opaque = rtems_heap_greedy_allocate(disk_size, 1); sc = rtems_blkdev_create( rda, BLOCK_SIZE, @@ -342,7 +344,7 @@ static void test_blkdev_imfs_errors(void) ); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); - opaque = rtems_heap_greedy_allocate(0); + opaque = rtems_heap_greedy_allocate(NULL, 0); sc = rtems_blkdev_create_partition( rda1, rda, @@ -352,7 +354,7 @@ static void test_blkdev_imfs_errors(void) rtems_test_assert(sc == RTEMS_NO_MEMORY); rtems_heap_greedy_free(opaque); - opaque = rtems_heap_greedy_allocate(sizeof(rtems_disk_device) + sizeof(int)); + opaque = rtems_heap_greedy_allocate(disk_size, 1); sc = rtems_blkdev_create_partition( rda1, rda, diff --git a/testsuites/libtests/devfs02/init.c b/testsuites/libtests/devfs02/init.c index 47a70a8a50..ad37aeb94d 100644 --- a/testsuites/libtests/devfs02/init.c +++ b/testsuites/libtests/devfs02/init.c @@ -62,7 +62,7 @@ rtems_task Init( puts( "Init - restore device table size" ); rootloc->mt_entry->immutable_fs_info = data; - opaque = rtems_heap_greedy_allocate( 0 ); + opaque = rtems_heap_greedy_allocate( NULL, 0 ); puts( "Init - attempt to create a node - expect ENOMEM" ); status = mknod( "/node", S_IFBLK, 0LL ); diff --git a/testsuites/psxtests/psxchroot01/test.c b/testsuites/psxtests/psxchroot01/test.c index 1e3f3ffc91..70298c4742 100644 --- a/testsuites/psxtests/psxchroot01/test.c +++ b/testsuites/psxtests/psxchroot01/test.c @@ -65,6 +65,10 @@ int main( ) #endif { + static const uintptr_t global_location_size = { + sizeof(rtems_filesystem_global_location_t) + }; + int status; void *opaque; /* @@ -108,9 +112,7 @@ int main( rtems_test_assert( errno == ENOTDIR ); puts( "allocate most of memory - attempt to fail chroot - expect ENOMEM" ); - opaque = rtems_heap_greedy_allocate( - sizeof(rtems_filesystem_global_location_t) - ); + opaque = rtems_heap_greedy_allocate( global_location_size, 1 ); status = chroot( "/one" ); rtems_test_assert( status == -1 ); diff --git a/testsuites/psxtests/psximfs02/init.c b/testsuites/psxtests/psximfs02/init.c index 10e97bba60..73724bd62a 100644 --- a/testsuites/psxtests/psximfs02/init.c +++ b/testsuites/psxtests/psximfs02/init.c @@ -35,15 +35,24 @@ rtems_task Init( rtems_task_argument argument ) { + static const char mount_point [] = "dir01"; + static const char fs_type [] = RTEMS_FILESYSTEM_TYPE_IMFS; + static const char slink_2_name [] = "node-slink-2"; + static const uintptr_t mount_table_entry_size [] = { + sizeof( rtems_filesystem_mount_table_entry_t ) + + sizeof( fs_type ) + + sizeof( rtems_filesystem_global_location_t ) + }; + static const uintptr_t slink_2_name_size [] = { + sizeof( slink_2_name ) + }; + int status = 0; void *opaque; char linkname_n[20] = {0}; char linkname_p[20] = {0}; int i; struct stat stat_buf; - static const char mount_point [] = "dir01"; - static const char fs_type [] = RTEMS_FILESYSTEM_TYPE_IMFS; - static const char slink_2_name [] = "node-slink-2"; puts( "\n\n*** TEST IMFS 02 ***" ); @@ -97,11 +106,7 @@ rtems_task Init( rtems_test_assert( errno == EACCES ); puts( "Allocate most of heap" ); - opaque = rtems_heap_greedy_allocate( - sizeof( rtems_filesystem_mount_table_entry_t ) - + sizeof( fs_type ) - + sizeof( rtems_filesystem_global_location_t ) - ); + opaque = rtems_heap_greedy_allocate( mount_table_entry_size, 1 ); printf( "Attempt to mount a fs at %s -- expect ENOMEM", mount_point ); status = mount( NULL, @@ -120,7 +125,7 @@ rtems_task Init( rtems_test_assert( status == 0 ); puts( "Allocate most of heap" ); - opaque = rtems_heap_greedy_allocate( 0 ); + opaque = rtems_heap_greedy_allocate( NULL, 0 ); puts( "Attempt to create /node-link-2 for /node -- expect ENOMEM" ); status = link( "/node", "/node-link-2" ); @@ -136,7 +141,7 @@ rtems_task Init( rtems_heap_greedy_free( opaque ); puts( "Allocate most of heap" ); - opaque = rtems_heap_greedy_allocate( sizeof( slink_2_name ) ); + opaque = rtems_heap_greedy_allocate( slink_2_name_size, 1 ); printf( "Attempt to create %s for /node -- expect ENOMEM", slink_2_name ); status = symlink( "/node", slink_2_name ); diff --git a/testsuites/psxtests/psxkey01/init.c b/testsuites/psxtests/psxkey01/init.c index dbd73d10f8..3383c8da3c 100644 --- a/testsuites/psxtests/psxkey01/init.c +++ b/testsuites/psxtests/psxkey01/init.c @@ -41,7 +41,7 @@ void *POSIX_Init( Init_id = pthread_self(); printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id ); - rtems_workspace_greedy_allocate( 0 ); + rtems_workspace_greedy_allocate( NULL, 0 ); puts("Init: pthread_key_create - ENOMEM (Workspace not available)"); empty_line(); diff --git a/testsuites/psxtests/psxmsgq02/init.c b/testsuites/psxtests/psxmsgq02/init.c index 4f5910a675..53c4769ba2 100644 --- a/testsuites/psxtests/psxmsgq02/init.c +++ b/testsuites/psxtests/psxmsgq02/init.c @@ -47,7 +47,7 @@ void *POSIX_Init( Init_id = pthread_self(); printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id ); - rtems_workspace_greedy_allocate( 0 ); + rtems_workspace_greedy_allocate( NULL, 0 ); attr.mq_maxmsg = MAXMSG; attr.mq_msgsize = MSGSIZE; diff --git a/testsuites/psxtests/psxobj01/init.c b/testsuites/psxtests/psxobj01/init.c index aee8bf7e52..3f639da80a 100644 --- a/testsuites/psxtests/psxobj01/init.c +++ b/testsuites/psxtests/psxobj01/init.c @@ -74,7 +74,7 @@ rtems_task Init( /* out of memory error ONLY when POSIX is enabled */ puts( "INIT - _Objects_Set_name fails - out of memory" ); - rtems_workspace_greedy_allocate( 0 ); + rtems_workspace_greedy_allocate( NULL, 0 ); bc = _Objects_Set_name( &TestClass, &_Thread_Executing->Object, name ); rtems_test_assert( bc == false ); diff --git a/testsuites/sptests/spfatal22/testcase.h b/testsuites/sptests/spfatal22/testcase.h index 188ff1d43f..268c48aed5 100644 --- a/testsuites/sptests/spfatal22/testcase.h +++ b/testsuites/sptests/spfatal22/testcase.h @@ -18,7 +18,7 @@ void force_error() { - rtems_heap_greedy_allocate( 0 ); + rtems_heap_greedy_allocate( NULL, 0 ); rtems_libio_init(); } diff --git a/testsuites/sptests/spprivenv01/init.c b/testsuites/sptests/spprivenv01/init.c index 609f85cae5..29b3b98561 100644 --- a/testsuites/sptests/spprivenv01/init.c +++ b/testsuites/sptests/spprivenv01/init.c @@ -47,7 +47,7 @@ rtems_task Init( puts( "\n\n*** TEST USER ENVIRONMENT ROUTINE - 01 ***" ); puts( "Init - allocating most of heap -- OK" ); - opaque = rtems_heap_greedy_allocate( 0 ); + opaque = rtems_heap_greedy_allocate( NULL, 0 ); puts( "Init - attempt to reset env - expect RTEMS_NO_MEMORY" ); sc = rtems_libio_set_private_env(); @@ -57,7 +57,7 @@ rtems_task Init( rtems_heap_greedy_free( opaque ); puts( "Init - allocating most of workspace memory" ); - opaque = rtems_workspace_greedy_allocate( 0 ); + opaque = rtems_workspace_greedy_allocate( NULL, 0 ); puts( "Init - attempt to reset env - expect RTEMS_TOO_MANY" ); sc = rtems_libio_set_private_env(); |