mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 20:07:45 +08:00
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:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
@@ -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 \
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user