mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
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.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
101
c/src/exec/score/src/heapgetinfo.c
Normal file
101
c/src/exec/score/src/heapgetinfo.c
Normal 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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
101
cpukit/score/src/heapgetinfo.c
Normal file
101
cpukit/score/src/heapgetinfo.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user