summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-10 10:36:26 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-10 10:42:58 +0100
commit28a08877ea961b0440b121b4617919136d6f342d (patch)
treec20ca716fad23ca298e98cf03bd8262150c8108e /cpukit/score
parentMoved empty test in front of busy tests (diff)
downloadrtems-28a08877ea961b0440b121b4617919136d6f342d.tar.bz2
Added support functions for greedy heap allocation
Various tests must check program paths that result due to failed memory allocations from the heap. To avoid tinkering with internal heap structures throughout the test code these functions should be used.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/Makefile.am3
-rw-r--r--cpukit/score/include/rtems/score/heap.h23
-rw-r--r--cpukit/score/src/heapgreedy.c62
3 files changed, 87 insertions, 1 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 13c31826b9..597da3e0cc 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -181,7 +181,8 @@ endif
## HEAP_C_FILES
libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
src/heapfree.c src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
- src/heapgetfreeinfo.c src/heapresizeblock.c src/heapiterate.c
+ src/heapgetfreeinfo.c src/heapresizeblock.c src/heapiterate.c \
+ src/heapgreedy.c
## OBJECT_C_FILES
libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
diff --git a/cpukit/score/include/rtems/score/heap.h b/cpukit/score/include/rtems/score/heap.h
index 1996fb80ff..8f508c9874 100644
--- a/cpukit/score/include/rtems/score/heap.h
+++ b/cpukit/score/include/rtems/score/heap.h
@@ -549,6 +549,29 @@ 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.
+ *
+ * @see _Heap_Greedy_free().
+ */
+Heap_Block *_Heap_Greedy_allocate(
+ Heap_Control *heap,
+ uintptr_t remaining_free_space
+);
+
+/**
+ * @brief Frees blocks of a greedy allocation.
+ *
+ * The @a blocks must be the return value of _Heap_Greedy_allocate().
+ */
+void _Heap_Greedy_free(
+ Heap_Control *heap,
+ Heap_Block *blocks
+);
+
+/**
* @brief Returns information about used and free blocks for the heap @a heap
* in @a info.
*/
diff --git a/cpukit/score/src/heapgreedy.c b/cpukit/score/src/heapgreedy.c
new file mode 100644
index 0000000000..4b38b7858a
--- /dev/null
+++ b/cpukit/score/src/heapgreedy.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/score/heap.h>
+
+Heap_Block *_Heap_Greedy_allocate(
+ Heap_Control *heap,
+ uintptr_t remaining_free_space
+)
+{
+ 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 *blocks = NULL;
+
+ while ( current != free_list_tail ) {
+ _Heap_Block_allocate(
+ heap,
+ current,
+ _Heap_Alloc_area_of_block( current ),
+ _Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
+ );
+
+ current->next = blocks;
+ blocks = current;
+ current = _Heap_Free_list_first( heap );
+ }
+
+ _Heap_Free( heap, free_space );
+
+ return blocks;
+}
+
+void _Heap_Greedy_free(
+ Heap_Control *heap,
+ Heap_Block *blocks
+)
+{
+ while ( blocks != NULL ) {
+ Heap_Block *current = blocks;
+
+ blocks = blocks->next;
+ _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
+ }
+}