diff options
-rw-r--r-- | cpukit/score/src/heapfree.c | 8 |
1 files changed, 7 insertions, 1 deletions
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; |