summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-07-17 10:19:16 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-07-17 10:19:16 +0200
commit317ee8d7ffd4bb6c785f7a7d8a84ccd7f873513f (patch)
treef51362b3092abb782995f9c9d59e0252a660d3ac
parentFix broken _endtext symbol (diff)
downloadrtems-317ee8d7ffd4bb6c785f7a7d8a84ccd7f873513f.tar.bz2
score: Change greedy allocation API
-rw-r--r--cpukit/libcsupport/include/rtems/malloc.h10
-rw-r--r--cpukit/libcsupport/src/rtems_heap_greedy.c7
-rw-r--r--cpukit/rtems/include/rtems/rtems/support.h10
-rw-r--r--cpukit/rtems/src/workspacegreedy.c7
-rw-r--r--cpukit/score/include/rtems/score/heap.h8
-rw-r--r--cpukit/score/src/heapgreedy.c33
-rw-r--r--testsuites/fstests/fsimfsgeneric01/init.c2
-rw-r--r--testsuites/libtests/block11/init.c10
-rw-r--r--testsuites/libtests/devfs02/init.c2
-rw-r--r--testsuites/psxtests/psxchroot01/test.c8
-rw-r--r--testsuites/psxtests/psximfs02/init.c25
-rw-r--r--testsuites/psxtests/psxkey01/init.c2
-rw-r--r--testsuites/psxtests/psxmsgq02/init.c2
-rw-r--r--testsuites/psxtests/psxobj01/init.c2
-rw-r--r--testsuites/sptests/spfatal22/testcase.h2
-rw-r--r--testsuites/sptests/spprivenv01/init.c4
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();