2004-11-29 Joel Sherrill <joel@OARcorp.com>

* libcsupport/src/mallocfreespace.c, rtems/Makefile.am,
	rtems/include/rtems/rtems/region.h, score/Makefile.am,
	score/include/rtems/score/heap.h, score/src/heapgetinfo.c: Add
	capability to return information about just the free blocks in a
	region or heap.  Also changed the semantics of free space available
	to be the largest block of memory that can be allocated.
	* rtems/src/regiongetfreeinfo.c, score/src/heapgetfreeinfo.c: New files.
	: score/include/rtems/score/object.h,
	score/src/objectinitializeinformation.c: Remove warning.
This commit is contained in:
Joel Sherrill
2004-11-29 22:45:43 +00:00
parent 55243362a7
commit 9b3f187a02
11 changed files with 225 additions and 25 deletions
+12
View File
@@ -1,3 +1,15 @@
2004-11-29 Joel Sherrill <joel@OARcorp.com>
* libcsupport/src/mallocfreespace.c, rtems/Makefile.am,
rtems/include/rtems/rtems/region.h, score/Makefile.am,
score/include/rtems/score/heap.h, score/src/heapgetinfo.c: Add
capability to return information about just the free blocks in a
region or heap. Also changed the semantics of free space available
to be the largest block of memory that can be allocated.
* rtems/src/regiongetfreeinfo.c, score/src/heapgetfreeinfo.c: New files.
: score/include/rtems/score/object.h,
score/src/objectinitializeinformation.c: Remove warning.
2004-11-22 Joel Sherrill <joel@OARcorp.com>
* score/include/rtems/score/object.h, score/src/objectclearname.c,
+2 -2
View File
@@ -37,8 +37,8 @@ size_t malloc_free_space( void )
{
region_information_block heap_info;
if ( !rtems_region_get_information( RTEMS_Malloc_Heap, &heap_info ) ) {
return (size_t) heap_info.free_size;
if ( !rtems_region_get_free_information( RTEMS_Malloc_Heap, &heap_info ) ) {
return (size_t) heap_info.Free.largest;
}
return (size_t) -1;
}
+2 -1
View File
@@ -107,7 +107,8 @@ SIGNAL_C_FILES = src/signal.c src/signalcatch.c src/signalsend.c
REGION_C_FILES = src/region.c src/regioncreate.c src/regiondelete.c \
src/regionextend.c src/regiongetsegment.c src/regiongetsegmentsize.c \
src/regionident.c src/regionreturnsegment.c src/regiongetinfo.c
src/regionident.c src/regionreturnsegment.c src/regiongetinfo.c \
src/regiongetfreeinfo.c
PARTITION_C_FILES = src/part.c src/partcreate.c src/partdelete.c \
src/partgetbuffer.c src/partident.c src/partreturnbuffer.c
+16 -1
View File
@@ -134,7 +134,7 @@ rtems_status_code rtems_region_ident(
);
/*
* rtems_region_ident
* rtems_region_get_information
*
* DESCRIPTION:
*
@@ -148,6 +148,21 @@ rtems_status_code rtems_region_get_information(
Heap_Information_block *the_info
);
/*
* rtems_region_get_free_information
*
* DESCRIPTION:
*
* This routine implements the rtems_region_get_free_information directive.
* This directive returns information about the free blocks in the
* heap associated with this region.
*/
rtems_status_code rtems_region_get_free_information(
Objects_Id id,
Heap_Information_block *the_info
);
/*
* rtems_region_delete
*
+78
View File
@@ -0,0 +1,78 @@
/*
* Region Manager
*
*
* COPYRIGHT (c) 1989-1999.
* 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.rtems.com/license/LICENSE.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/object.h>
#include <rtems/rtems/options.h>
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/apimutex.h>
#include <rtems/score/thread.h>
/*PAGE
*
* rtems_region_get_free_information
*
* This directive will return information about the free blocks
* in the region specified. Information about the used blocks
* will be returned as zero.
*
* Input parameters:
* id - region id
* the_info - pointer to region information block
*
* Output parameters:
* *the_info - region information block filled in
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_region_get_free_information(
Objects_Id id,
Heap_Information_block *the_info
)
{
register Region_Control *the_region;
Objects_Locations location;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
_RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
_RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
the_info->Used.number = 0;
the_info->Used.total = 0;
the_info->Used.largest = 0;
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
_RTEMS_Unlock_allocator();
return RTEMS_INVALID_ADDRESS;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
+2 -1
View File
@@ -94,7 +94,8 @@ CORE_SEMAPHORE_C_FILES = src/coresem.c src/coresemflush.c src/coresemseize.c \
src/coresemsurrender.c
HEAP_C_FILES = src/heap.c src/heapallocate.c src/heapextend.c src/heapfree.c \
src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c
src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
src/heapgetfreeinfo.c
OBJECT_C_FILES = src/object.c src/objectallocate.c \
src/objectallocatebyindex.c src/objectclearname.c \
+35 -8
View File
@@ -54,18 +54,31 @@ typedef enum {
HEAP_GET_INFORMATION_BLOCK_ERROR
} Heap_Get_information_status;
/**
* Information block returned by the Heap routines used to
* obtain statistics. This information is returned about
* either free or used blocks.
*/
typedef struct {
/** Number of blocks of this type. */
uint32_t number;
/** Largest blocks of this type. */
uint32_t largest;
/** Total size of the blocks of this type. */
uint32_t total;
} Heap_Information;
/**
* Information block returned by _Heap_Get_information
*/
typedef struct {
/** This field is the number of free blocks in this heap. */
uint32_t free_blocks;
/** This field is the amount of free memory in this heap. */
uint32_t free_size;
/** This field is the number of used blocks in this heap. */
uint32_t used_blocks;
/** This field is the amount of used memory in this heap. */
uint32_t used_size;
/** This field is information on the used blocks in the heap. */
Heap_Information Free;
/** This field is information on the used blocks in the heap. */
Heap_Information Used;
} Heap_Information_block;
/**
@@ -278,6 +291,20 @@ Heap_Get_information_status _Heap_Get_information(
Heap_Information_block *the_info
);
/**
* This heap routine returns information about the free blocks
* in the specified heap.
*
* @param the_heap (in) pointer to heap header.
* @param info (in) pointer to the free block information.
*
* @return free block information filled in.
*/
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
);
#ifndef __RTEMS_APPLICATION__
#include <rtems/score/heap.inl>
+2 -2
View File
@@ -231,7 +231,7 @@ typedef struct {
void **object_blocks; /* the object memory to remove */
boolean is_string; /* TRUE if names are strings */
uint16_t name_length; /* maximum length of names */
Objects_Thread_queue_Extract_callout *extract;
Objects_Thread_queue_Extract_callout extract;
#if defined(RTEMS_MULTIPROCESSING)
Chain_Control *global_table; /* pointer to global table */
#endif
@@ -351,7 +351,7 @@ void _Objects_Initialize_information (
#if defined(RTEMS_MULTIPROCESSING)
,
boolean supports_global,
Objects_Thread_queue_Extract_callout *extract
Objects_Thread_queue_Extract_callout extract
#endif
);
+58
View File
@@ -0,0 +1,58 @@
/*
* Heap Handler
*
* COPYRIGHT (c) 1989-2004.
* 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.rtems.com/license/LICENSE.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/heap.h>
/*PAGE
*
* _Heap_Get_free_information
*
* This heap routine returns information about the free blocks
* in the specified heap.
*
* Input parameters:
* the_heap - pointer to heap header.
* info - pointer to the free block information.
*
* Output parameters:
* returns - free block information filled in.
*/
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
)
{
Heap_Block *the_block;
info->number = 0;
info->largest = 0;
info->total = 0;
for ( the_block = the_heap->first;
;
the_block = the_block->next ) {
if ( the_block == _Heap_Tail( the_heap ) )
return;
info->number++;
info->largest = 0;
info->total += the_block->front_flag;
if ( the_block->front_flag >= info->largest )
info->largest = the_block->front_flag;
}
}
+16 -8
View File
@@ -40,12 +40,15 @@ Heap_Get_information_status _Heap_Get_information(
Heap_Block *the_block = 0; /* avoid warnings */
Heap_Block *next_block = 0; /* avoid warnings */
int notdone = 1;
uint32_t size;
the_info->free_blocks = 0;
the_info->free_size = 0;
the_info->used_blocks = 0;
the_info->used_size = 0;
the_info->Free.number = 0;
the_info->Free.total = 0;
the_info->Free.largest = 0;
the_info->Used.number = 0;
the_info->Used.total = 0;
the_info->Used.largest = 0;
/*
* We don't want to allow walking the heap until we have
@@ -72,12 +75,17 @@ Heap_Get_information_status _Heap_Get_information(
* Accumulate size
*/
size = _Heap_Block_size(the_block);
if ( _Heap_Is_block_free(the_block) ) {
the_info->free_blocks++;
the_info->free_size += _Heap_Block_size(the_block);
the_info->Free.number++;
the_info->Free.total += size;
if ( size > the_info->Free.largest )
the_info->Free.largest = size;
} else {
the_info->used_blocks++;
the_info->used_size += _Heap_Block_size(the_block);
the_info->Used.number++;
the_info->Used.total += size;
if ( size > the_info->Used.largest )
the_info->Used.largest = size;
}
/*
@@ -38,7 +38,7 @@
* maximum_name_length - maximum length of each object's name
* When multiprocessing is configured,
* supports_global - TRUE if this is a global object class
* extract_callout - pointer to threadq extract callout if MP
* extract_callout - pointer to threadq extract callout
*
* Output parameters: NONE
*/
@@ -54,7 +54,7 @@ void _Objects_Initialize_information(
#if defined(RTEMS_MULTIPROCESSING)
,
boolean supports_global,
Objects_Thread_queue_Extract_callout *extract
Objects_Thread_queue_Extract_callout extract
#endif
)
{