From 1d48e25d6ba51e92773e28c5d561557491fc7a9d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 24 Jun 2013 16:48:17 +0200 Subject: heap: Workaround for workspace protection --- cpukit/score/src/heapfree.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cpukit/score/src/heapfree.c b/cpukit/score/src/heapfree.c index 30a84a08b4..7ff1363195 100644 --- a/cpukit/score/src/heapfree.c +++ b/cpukit/score/src/heapfree.c @@ -81,6 +81,7 @@ ) { bool do_free = true; + Heap_Block *const next = block->Protection_begin.next_delayed_free_block; /* * Sometimes after a free the allocated area is still in use. An example @@ -88,7 +89,6 @@ * disable level is a way to detect this use case. */ if ( _Thread_Dispatch_is_enabled() ) { - Heap_Block *const next = block->Protection_begin.next_delayed_free_block; if ( next == NULL ) { _Heap_Protection_delay_block_free( heap, block ); do_free = false; @@ -97,6 +97,12 @@ } else { _Heap_Protection_block_error( heap, block ); } + } else if ( next == NULL ) { + /* + * This is a hack to prevent heavy workspace fragmentation which would + * lead to test suite failures. + */ + _Heap_Protection_free_all_delayed_blocks( heap ); } return do_free; -- cgit v1.2.3