summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-10-18 14:57:12 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-10-18 14:57:12 +0000
commit252565f24da1ca21bd681acf621201b5318d95d7 (patch)
tree0b35eb16e1f3871d3fa9e0d5071397247ab8cb88 /cpukit/score/src
parent2000-09-14 Ralf Corsepius <corsepiu@faw.uni-ulm.de> (diff)
downloadrtems-252565f24da1ca21bd681acf621201b5318d95d7.tar.bz2
2000-10-18 Nick Simon <Nick.SIMON@syntegra.bt.co.uk>
* src/heapgetinfo.c, include/rtems/score/heap.h, src/Makefile.am: Added _Heap_Get_information() and information control block. * src/heapgetinfo.c: New file.
Diffstat (limited to 'cpukit/score/src')
-rw-r--r--cpukit/score/src/Makefile.am2
-rw-r--r--cpukit/score/src/heapgetinfo.c101
2 files changed, 102 insertions, 1 deletions
diff --git a/cpukit/score/src/Makefile.am b/cpukit/score/src/Makefile.am
index 5e27949c90..71b597e533 100644
--- a/cpukit/score/src/Makefile.am
+++ b/cpukit/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/cpukit/score/src/heapgetinfo.c b/cpukit/score/src/heapgetinfo.c
new file mode 100644
index 0000000000..a55348c3c8
--- /dev/null
+++ b/cpukit/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 <rtems/system.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/heap.h>
+
+/*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;
+}