Index: cpukit/ChangeLog
===================================================================
--- cpukit/ChangeLog	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/ChangeLog	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -1,2 +1,14 @@
+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>
 
Index: cpukit/libcsupport/src/mallocfreespace.c
===================================================================
--- cpukit/libcsupport/src/mallocfreespace.c	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/libcsupport/src/mallocfreespace.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -38,6 +38,6 @@
   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;
Index: cpukit/rtems/Makefile.am
===================================================================
--- cpukit/rtems/Makefile.am	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/rtems/Makefile.am	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -108,5 +108,6 @@
 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 \
Index: cpukit/rtems/include/rtems/rtems/region.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/region.h	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/rtems/include/rtems/rtems/region.h	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -135,5 +135,5 @@
 
 /*
- *  rtems_region_ident
+ *  rtems_region_get_information
  *
  *  DESCRIPTION:
@@ -145,4 +145,19 @@
 
 rtems_status_code rtems_region_get_information(
+  Objects_Id              id,
+  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
Index: cpukit/rtems/src/regiongetfreeinfo.c
===================================================================
--- cpukit/rtems/src/regiongetfreeinfo.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
+++ cpukit/rtems/src/regiongetfreeinfo.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -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 */
+}
Index: cpukit/score/Makefile.am
===================================================================
--- cpukit/score/Makefile.am	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/score/Makefile.am	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -95,5 +95,6 @@
 
 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 \
Index: cpukit/score/include/rtems/score/heap.h
===================================================================
--- cpukit/score/include/rtems/score/heap.h	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/score/include/rtems/score/heap.h	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -56,15 +56,28 @@
 
 /**
+ *  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;
 
@@ -279,4 +292,18 @@
 );
 
+/**
+ *  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__
Index: cpukit/score/include/rtems/score/object.h
===================================================================
--- cpukit/score/include/rtems/score/object.h	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/score/include/rtems/score/object.h	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -232,5 +232,5 @@
   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 */
@@ -352,5 +352,5 @@
   ,
   boolean              supports_global,
-  Objects_Thread_queue_Extract_callout *extract
+  Objects_Thread_queue_Extract_callout extract
 #endif
 );
Index: cpukit/score/src/heapgetfreeinfo.c
===================================================================
--- cpukit/score/src/heapgetfreeinfo.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
+++ cpukit/score/src/heapgetfreeinfo.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -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;
+  }
+}
Index: cpukit/score/src/heapgetinfo.c
===================================================================
--- cpukit/score/src/heapgetinfo.c	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/score/src/heapgetinfo.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -41,10 +41,13 @@
   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;
 
   /*
@@ -73,10 +76,15 @@
        */
 
+      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;
       }
 
Index: cpukit/score/src/objectinitializeinformation.c
===================================================================
--- cpukit/score/src/objectinitializeinformation.c	(revision 55243362a7b307e6ea4bd62bd9c8fe05f7826fb7)
+++ cpukit/score/src/objectinitializeinformation.c	(revision 9b3f187a02049d81a63bb85497c5a4ebb9d37a97)
@@ -39,5 +39,5 @@
  *    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
@@ -55,5 +55,5 @@
   ,
   boolean              supports_global,
-  Objects_Thread_queue_Extract_callout *extract
+  Objects_Thread_queue_Extract_callout extract
 #endif
 )
