diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-24 16:48:17 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-25 17:03:21 +0200 |
commit | 1d48e25d6ba51e92773e28c5d561557491fc7a9d (patch) | |
tree | 465948fa7cb9f81c827e915cbe01b13ab06e3600 | |
parent | termios: Update due to API changes (diff) | |
download | rtems-1d48e25d6ba51e92773e28c5d561557491fc7a9d.tar.bz2 |
heap: Workaround for workspace protection
-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; |