* src/heapgetinfo.c, include/rtems/score/heap.h, src/Makefile.am:
	Added _Heap_Get_information() and information control block.
	* src/heapgetinfo.c: New file.
This commit is contained in:
Joel Sherrill
2000-10-18 14:57:12 +00:00
parent aac7fdd28c
commit 252565f24d
8 changed files with 304 additions and 2 deletions

View File

@@ -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

View File

@@ -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 <rtems/score/heap.inl>
#endif

View File

@@ -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 \

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 <rtems/score/heap.inl>
#endif

View File

@@ -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 \

View File

@@ -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;
}