score: Change greedy allocation API

This commit is contained in:
Sebastian Huber
2012-07-17 10:19:16 +02:00
parent aae7daa988
commit 317ee8d7ff
16 changed files with 88 additions and 46 deletions

View File

@@ -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.

View File

@@ -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;

View File

@@ -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.

View File

@@ -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;

View File

@@ -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
);
/**

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 );

View File

@@ -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 );

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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;

View File

@@ -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 );

View File

@@ -18,7 +18,7 @@
void force_error()
{
rtems_heap_greedy_allocate( 0 );
rtems_heap_greedy_allocate( NULL, 0 );
rtems_libio_init();
}

View File

@@ -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();