summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/heapwalk.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-06-07 09:35:01 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-06-07 09:35:01 +0000
commitb2a0214d4395787eca8e74375d283bf26c9ca4a1 (patch)
treeeb91086d7da6342ea88ad774939bb90afcfd3e4f /cpukit/score/src/heapwalk.c
parent2010-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-b2a0214d4395787eca8e74375d283bf26c9ca4a1.tar.bz2
2010-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
* score/include/rtems/score/heap.h: Declare _Heap_Get_first_and_last_block(). Removed Heap_Extend_status. Changed return type of _Heap_Extend() to bool. * score/inline/rtems/score/heap.inl: Define _Heap_Set_last_block_size(). * score/src/heap.c: Define and use _Heap_Get_first_and_last_block(). * score/src/heapgetinfo.c: Removed assert statements. Do not count the last block. This ensures that all size values are an integral multiple of the page size which is consistent with the other statistics. * score/src/heapextend.c: Implemented support for scattered heap areas. * score/src/heapwalk.c: Dump also last block. Changes for new first and last block values. * ./score/src/pheapextend.c, rtems/src/regionextend.c: Update for _Heap_Extend() changes.
Diffstat (limited to 'cpukit/score/src/heapwalk.c')
-rw-r--r--cpukit/score/src/heapwalk.c69
1 files changed, 35 insertions, 34 deletions
diff --git a/cpukit/score/src/heapwalk.c b/cpukit/score/src/heapwalk.c
index f7043c0c41..fae0bd6330 100644
--- a/cpukit/score/src/heapwalk.c
+++ b/cpukit/score/src/heapwalk.c
@@ -217,23 +217,23 @@ static bool _Heap_Walk_check_control(
return false;
}
- if ( first_block->prev_size != page_size ) {
+ if ( _Heap_Is_free( last_block ) ) {
(*printer)(
source,
true,
- "first block: prev size %u != page size %u\n",
- first_block->prev_size,
- page_size
+ "last block: is free\n"
);
return false;
}
- if ( _Heap_Is_free( last_block ) ) {
+ if (
+ _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
+ ) {
(*printer)(
source,
true,
- "last block: is free\n"
+ "last block: next block is not the first block\n"
);
return false;
@@ -260,15 +260,16 @@ static bool _Heap_Walk_check_free_block(
(*printer)(
source,
false,
- "block 0x%08x: prev 0x%08x%s, next 0x%08x%s\n",
+ "block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
+ block_size,
block->prev,
block->prev == first_free_block ?
- " (= first)"
+ " (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
- " (= last)"
+ " (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
@@ -319,8 +320,9 @@ bool _Heap_Walk(
{
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
+ Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
- Heap_Block *block = heap->first_block;
+ Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
@@ -332,31 +334,13 @@ bool _Heap_Walk(
return false;
}
- while ( block != last_block ) {
+ do {
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
-
- if ( prev_used ) {
- (*printer)(
- source,
- false,
- "block 0x%08x: size %u\n",
- block,
- block_size
- );
- } else {
- (*printer)(
- source,
- false,
- "block 0x%08x: size %u, prev_size %u\n",
- block,
- block_size,
- block->prev_size
- );
- }
+ bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
@@ -370,7 +354,7 @@ bool _Heap_Walk(
return false;
}
- if ( !_Heap_Is_aligned( block_size, page_size ) ) {
+ if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
source,
true,
@@ -382,7 +366,7 @@ bool _Heap_Walk(
return false;
}
- if ( block_size < min_block_size ) {
+ if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
source,
true,
@@ -395,7 +379,7 @@ bool _Heap_Walk(
return false;
}
- if ( next_block_begin <= block_begin ) {
+ if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
source,
true,
@@ -411,10 +395,27 @@ bool _Heap_Walk(
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
+ } else if (prev_used) {
+ (*printer)(
+ source,
+ false,
+ "block 0x%08x: size %u\n",
+ block,
+ block_size
+ );
+ } else {
+ (*printer)(
+ source,
+ false,
+ "block 0x%08x: size %u, prev_size %u\n",
+ block,
+ block_size,
+ block->prev_size
+ );
}
block = next_block;
- }
+ } while ( block != first_block );
return true;
}