summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score
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 /c/src/exec/score
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 '')
-rw-r--r--c/src/exec/score/ChangeLog6
-rw-r--r--c/src/exec/score/include/rtems/score/heap.h44
-rw-r--r--c/src/exec/score/src/Makefile.am2
-rw-r--r--c/src/exec/score/src/heapgetinfo.c101
4 files changed, 152 insertions, 1 deletions
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 <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.
+
2000-09-25 Joel Sherrill <joel@OARcorp.com>
* 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
@@ -36,6 +36,27 @@ typedef enum {
} 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 <rtems/score/heap.inl>
#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 <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;
+}