forked from Imagelibrary/rtems
score: Change greedy allocation API
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
void force_error()
|
||||
{
|
||||
rtems_heap_greedy_allocate( 0 );
|
||||
rtems_heap_greedy_allocate( NULL, 0 );
|
||||
|
||||
rtems_libio_init();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user