From 252565f24da1ca21bd681acf621201b5318d95d7 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 18 Oct 2000 14:57:12 +0000 Subject: 2000-10-18 Nick Simon * src/heapgetinfo.c, include/rtems/score/heap.h, src/Makefile.am: Added _Heap_Get_information() and information control block. * src/heapgetinfo.c: New file. --- c/src/exec/score/ChangeLog | 6 ++ c/src/exec/score/include/rtems/score/heap.h | 44 ++++++++++++ c/src/exec/score/src/Makefile.am | 2 +- c/src/exec/score/src/heapgetinfo.c | 101 ++++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 c/src/exec/score/src/heapgetinfo.c (limited to 'c/src/exec') diff --git a/c/src/exec/score/ChangeLog b/c/src/exec/score/ChangeLog index 37642e1706..34db9903f4 100644 --- a/c/src/exec/score/ChangeLog +++ b/c/src/exec/score/ChangeLog @@ -1,4 +1,10 @@ +2000-10-18 Nick Simon + + * src/heapgetinfo.c, include/rtems/score/heap.h, src/Makefile.am: + Added _Heap_Get_information() and information control block. + * src/heapgetinfo.c: New file. + 2000-09-25 Joel Sherrill * rtems/system.h: Switched a29k and hppa1.1 to using cpuopts.h not diff --git a/c/src/exec/score/include/rtems/score/heap.h b/c/src/exec/score/include/rtems/score/heap.h index 1a502f7999..10e8cd260f 100644 --- a/c/src/exec/score/include/rtems/score/heap.h +++ b/c/src/exec/score/include/rtems/score/heap.h @@ -35,6 +35,27 @@ typedef enum { HEAP_EXTEND_NOT_IMPLEMENTED } Heap_Extend_status; +/* + * Status codes for _Heap_Get_information + */ + +typedef enum { + HEAP_GET_INFORMATION_SUCCESSFUL = 0, + HEAP_GET_INFORMATION_SYSTEM_STATE_ERROR, + HEAP_GET_INFORMATION_BLOCK_ERROR +} Heap_Get_information_status; + +/* + * Information block returned by _Heap_Get_information + */ + +typedef struct { + unsigned32 free_blocks; + unsigned32 free_size; + unsigned32 used_blocks; + unsigned32 used_size; +} Heap_Information_block; + /* * Constants used in the size/used field of each heap block to * indicate when a block is free or in use. @@ -213,6 +234,29 @@ void _Heap_Walk( boolean do_dump ); +/*PAGE + * + * _Heap_Get_information + * + * This kernel routine walks the heap and tots up the free and allocated + * sizes. Derived from _Heap_Walk. + * + * Input parameters: + * the_heap - pointer to heap header + * the_info - pointer to information block + * + * Output parameters: + * *the_info - status information + * return 0=success, otherwise heap is corrupt. + */ + + +Heap_Get_information_status _Heap_Get_information( + Heap_Control *the_heap, + Heap_Information_block *the_info +); + + #ifndef __RTEMS_APPLICATION__ #include #endif diff --git a/c/src/exec/score/src/Makefile.am b/c/src/exec/score/src/Makefile.am index 5e27949c90..71b597e533 100644 --- a/c/src/exec/score/src/Makefile.am +++ b/c/src/exec/score/src/Makefile.am @@ -22,7 +22,7 @@ CORE_SEMAPHORE_C_FILES = coresem.c coresemflush.c coresemseize.c \ coresemsurrender.c HEAP_C_FILES = heap.c heapallocate.c heapextend.c heapfree.c \ - heapsizeofuserarea.c heapwalk.c + heapsizeofuserarea.c heapwalk.c heapgetinfo.c OBJECT_C_FILES = object.c objectallocate.c objectallocatebyindex.c \ objectclearname.c objectcomparenameraw.c objectcomparenamestring.c \ diff --git a/c/src/exec/score/src/heapgetinfo.c b/c/src/exec/score/src/heapgetinfo.c new file mode 100644 index 0000000000..a55348c3c8 --- /dev/null +++ b/c/src/exec/score/src/heapgetinfo.c @@ -0,0 +1,101 @@ +/* + * Heap Handler + * + * COPYRIGHT (c) 1989-2000. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + */ + + +#include +#include +#include + +/*PAGE + * + * _Heap_Get_information + * + * This kernel routine walks the heap and tots up the free and allocated + * sizes. Derived from _Heap_Walk. + * + * Input parameters: + * the_heap - pointer to heap header + * + * Output parameters: + * free_sz - Pointer for free amount return + * used_sz - Pointer for used amount return + * return 0=success, otherwise heap is corrupt. + */ + + +Heap_Get_information_status _Heap_Get_information( + Heap_Control *the_heap, + Heap_Information_block *the_info +) +{ + Heap_Block *the_block = 0; /* avoid warnings */ + Heap_Block *next_block = 0; /* avoid warnings */ + int notdone = 1; + + + the_info->free_blocks = 0; + the_info->free_size = 0; + the_info->used_blocks = 0; + the_info->used_size = 0; + + /* + * We don't want to allow walking the heap until we have + * transferred control to the user task so we watch the + * system state. + */ + + if ( !_System_state_Is_up( _System_state_Get() ) ) + return HEAP_GET_INFORMATION_SYSTEM_STATE_ERROR; + + the_block = the_heap->start; + + /* + * Handle the 1st block + */ + + if ( the_block->back_flag != HEAP_DUMMY_FLAG ) { + return HEAP_GET_INFORMATION_BLOCK_ERROR; + } + + while (notdone) { + + /* + * Accumulate size + */ + + if ( _Heap_Is_block_free(the_block) ) { + the_info->free_blocks++; + the_info->free_size += _Heap_Block_size(the_block); + } else { + the_info->used_blocks++; + the_info->used_size += _Heap_Block_size(the_block); + } + + /* + * Handle the last block + */ + + if ( the_block->front_flag != HEAP_DUMMY_FLAG ) { + next_block = _Heap_Next_block(the_block); + if ( the_block->front_flag != next_block->back_flag ) { + return HEAP_GET_INFORMATION_BLOCK_ERROR; + } + } + + if ( the_block->front_flag == HEAP_DUMMY_FLAG ) + notdone = 0; + else + the_block = next_block; + } /* while(notdone) */ + + return HEAP_GET_INFORMATION_SUCCESSFUL; +} -- cgit v1.2.3