forked from Imagelibrary/rtems
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().
This commit is contained in:
@@ -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>
|
2011-12-06 Ralf Corsépius <ralf.corsepius@rtems.org>
|
||||||
|
|
||||||
* libcsupport/src/flockfile.c, libcsupport/src/ftrylockfile.c,
|
* libcsupport/src/flockfile.c, libcsupport/src/ftrylockfile.c,
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ endif
|
|||||||
## HEAP_C_FILES
|
## HEAP_C_FILES
|
||||||
libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
|
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/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
|
## OBJECT_C_FILES
|
||||||
libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
|
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 \
|
libscore_a_SOURCES += src/pheapallocate.c \
|
||||||
src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \
|
src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \
|
||||||
src/pheapgetblocksize.c src/pheapgetfreeinfo.c src/pheapgetinfo.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
|
## RBTREE_C_FILES
|
||||||
libscore_a_SOURCES += src/rbtree.c \
|
libscore_a_SOURCES += src/rbtree.c \
|
||||||
|
|||||||
@@ -521,6 +521,33 @@ bool _Heap_Walk(
|
|||||||
bool dump
|
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
|
* @brief Returns information about used and free blocks for the heap @a heap
|
||||||
* in @a info.
|
* in @a info.
|
||||||
|
|||||||
@@ -130,6 +130,15 @@ bool _Protected_heap_Free( Heap_Control *heap, void *addr );
|
|||||||
*/
|
*/
|
||||||
bool _Protected_heap_Walk( Heap_Control *heap, int source, bool dump );
|
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().
|
* @brief See _Heap_Get_information().
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -23,35 +23,32 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <rtems/system.h>
|
|
||||||
#include <rtems/score/sysstate.h>
|
|
||||||
#include <rtems/score/heap.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(
|
void _Heap_Get_information(
|
||||||
Heap_Control *the_heap,
|
Heap_Control *the_heap,
|
||||||
Heap_Information_block *the_info
|
Heap_Information_block *the_info
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Heap_Block *the_block = the_heap->first_block;
|
memset( the_info, 0, sizeof(*the_info) );
|
||||||
Heap_Block *const end = the_heap->last_block;
|
_Heap_Iterate( the_heap, _Heap_Get_information_visitor, the_info );
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
50
cpukit/score/src/heapiterate.c
Normal file
50
cpukit/score/src/heapiterate.c
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
40
cpukit/score/src/pheapiterate.c
Normal file
40
cpukit/score/src/pheapiterate.c
Normal 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();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user