From 28a08877ea961b0440b121b4617919136d6f342d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 10 Feb 2012 10:36:26 +0100 Subject: 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. --- cpukit/score/src/heapgreedy.c | 62 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 cpukit/score/src/heapgreedy.c (limited to 'cpukit/score/src/heapgreedy.c') 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 + * + * + * 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 + +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 ) ); + } +} -- cgit v1.2.3