* score/src/heapiterate.c, score/src/pheapiterate.c: New files.
	* score/Makefile.am: Reflect changes above.
	* score/include/rtems/score/heap.h: Declare _Heap_Iterate() and define
	Heap_Block_visitor.
	* score/include/rtems/score/protectedheap.h: Declare
	_Protected_heap_Iterate().
	* score/src/heapgetinfo.c: Use _Heap_Iterate().
This commit is contained in:
Sebastian Huber
2011-12-06 14:23:26 +00:00
parent 7e0ef0f7b3
commit a89ae540c1
7 changed files with 159 additions and 26 deletions

View File

@@ -1,3 +1,13 @@
2011-12-06 Sebastian Huber <sebastian.huber@embedded-brains.de>
* score/src/heapiterate.c, score/src/pheapiterate.c: New files.
* score/Makefile.am: Reflect changes above.
* score/include/rtems/score/heap.h: Declare _Heap_Iterate() and define
Heap_Block_visitor.
* score/include/rtems/score/protectedheap.h: Declare
_Protected_heap_Iterate().
* score/src/heapgetinfo.c: Use _Heap_Iterate().
2011-12-06 Ralf Corsépius <ralf.corsepius@rtems.org>
* libcsupport/src/flockfile.c, libcsupport/src/ftrylockfile.c,

View File

@@ -181,7 +181,7 @@ endif
## HEAP_C_FILES
libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
src/heapfree.c src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
src/heapgetfreeinfo.c src/heapresizeblock.c
src/heapgetfreeinfo.c src/heapresizeblock.c src/heapiterate.c
## OBJECT_C_FILES
libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
@@ -259,7 +259,7 @@ libscore_a_SOURCES += src/schedulercbs.c \
libscore_a_SOURCES += src/pheapallocate.c \
src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \
src/pheapgetblocksize.c src/pheapgetfreeinfo.c src/pheapgetinfo.c \
src/pheapinit.c src/pheapresizeblock.c src/pheapwalk.c
src/pheapinit.c src/pheapresizeblock.c src/pheapwalk.c src/pheapiterate.c
## RBTREE_C_FILES
libscore_a_SOURCES += src/rbtree.c \

View File

@@ -521,6 +521,33 @@ bool _Heap_Walk(
bool dump
);
/**
* @brief Heap block visitor.
*
* @see _Heap_Iterate().
*
* @retval true Stop the iteration.
* @retval false Continue the iteration.
*/
typedef bool (*Heap_Block_visitor)(
const Heap_Block *block,
uintptr_t block_size,
bool block_is_used,
void *visitor_arg
);
/**
* @brief Iterates over all blocks of the heap.
*
* For each block the @a visitor with the argument @a visitor_arg will be
* called.
*/
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
);
/**
* @brief Returns information about used and free blocks for the heap @a heap
* in @a info.

View File

@@ -130,6 +130,15 @@ bool _Protected_heap_Free( Heap_Control *heap, void *addr );
*/
bool _Protected_heap_Walk( Heap_Control *heap, int source, bool dump );
/**
* @brief See _Heap_Iterate().
*/
void _Protected_heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
);
/**
* @brief See _Heap_Get_information().
*

View File

@@ -23,35 +23,32 @@
#include <string.h>
#include <rtems/system.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/heap.h>
static bool _Heap_Get_information_visitor(
const Heap_Block *block __attribute__((unused)),
uintptr_t block_size,
bool block_is_used,
void *visitor_arg
)
{
Heap_Information_block *info_block = visitor_arg;
Heap_Information *info = block_is_used ?
&info_block->Used : &info_block->Free;
++info->number;
info->total += block_size;
if ( info->largest < block_size )
info->largest = block_size;
return false;
}
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
memset( the_info, 0, sizeof(*the_info) );
_Heap_Iterate( the_heap, _Heap_Get_information_visitor, the_info );
}

View File

@@ -0,0 +1,50 @@
/**
* @file
*
* @ingroup ScoreHeap
*
* @brief _Heap_Iterate() implementation.
*/
/*
* Copyright (c) 2011 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* 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.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/heap.h>
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
uintptr_t size = _Heap_Block_size( current );
Heap_Block *next = _Heap_Block_at( current, size );
bool used = _Heap_Is_prev_used( next );
stop = (*visitor)( current, size, used, visitor_arg );
current = next;
}
}

View File

@@ -0,0 +1,40 @@
/**
* @file
*
* @ingroup ScoreProtHeap
*
* @brief _Heap_Iterate() implementation.
*/
/*
* Copyright (c) 2011 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* 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.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/protectedheap.h>
void _Protected_heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
_RTEMS_Lock_allocator();
_Heap_Iterate( heap, visitor, visitor_arg );
_RTEMS_Unlock_allocator();
}