OK. A general comment it it would be nice to unify RTEMS various "statistics" into a common format for easier printing and transferring off-board.
-gedare On Thu, Nov 27, 2014 at 7:26 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > Print out heap statistics via the MALLOC and WKSPACE shell commands. > --- > cpukit/libmisc/shell/internal.h | 7 ++++-- > cpukit/libmisc/shell/main_mallocinfo.c | 1 + > cpukit/libmisc/shell/main_wkspaceinfo.c | 3 ++- > cpukit/libmisc/shell/print_heapinfo.c | 39 > +++++++++++++++++++++++++++------ > cpukit/score/include/rtems/score/heap.h | 3 ++- > cpukit/score/src/heapgetinfo.c | 1 + > doc/shell/memory.t | 31 +++++++++++++++++++++----- > 7 files changed, 68 insertions(+), 17 deletions(-) > > diff --git a/cpukit/libmisc/shell/internal.h b/cpukit/libmisc/shell/internal.h > index 0187e5f..8ec2da0 100644 > --- a/cpukit/libmisc/shell/internal.h > +++ b/cpukit/libmisc/shell/internal.h > @@ -32,10 +32,13 @@ int rtems_shell_execute_cmd(const char *cmd, int argc, > char *argv[]); > extern void rtems_shell_register_monitor_commands(void); > > extern void rtems_shell_print_heap_info( > - const char *c, > - Heap_Information *h > + const char *c, > + const Heap_Information *h > ); > > +extern void rtems_shell_print_heap_stats( > + const Heap_Statistics *s > +); > > extern void rtems_shell_print_unified_work_area_message(void); > > diff --git a/cpukit/libmisc/shell/main_mallocinfo.c > b/cpukit/libmisc/shell/main_mallocinfo.c > index 54c602a..43e9883 100644 > --- a/cpukit/libmisc/shell/main_mallocinfo.c > +++ b/cpukit/libmisc/shell/main_mallocinfo.c > @@ -37,6 +37,7 @@ static int rtems_shell_main_malloc_info( > malloc_info( &info ); > rtems_shell_print_heap_info( "free", &info.Free ); > rtems_shell_print_heap_info( "used", &info.Used ); > + rtems_shell_print_heap_stats( &info.Stats ); > } > > return 0; > diff --git a/cpukit/libmisc/shell/main_wkspaceinfo.c > b/cpukit/libmisc/shell/main_wkspaceinfo.c > index f4f6f4d..a990652 100644 > --- a/cpukit/libmisc/shell/main_wkspaceinfo.c > +++ b/cpukit/libmisc/shell/main_wkspaceinfo.c > @@ -24,7 +24,7 @@ > > void rtems_shell_print_unified_work_area_message(void) > { > - printf( "\nC Program Heap and RTEMS Workspace are %s.\n", > + printf( "C Program Heap and RTEMS Workspace are %s.\n", > rtems_configuration_get_unified_work_area() ? "the same" : "separate" > ); > } > @@ -41,6 +41,7 @@ static int rtems_shell_main_wkspace_info( > _Protected_heap_Get_information( &_Workspace_Area, &info ); > rtems_shell_print_heap_info( "free", &info.Free ); > rtems_shell_print_heap_info( "used", &info.Used ); > + rtems_shell_print_heap_stats( &info.Stats ); > > return 0; > } > diff --git a/cpukit/libmisc/shell/print_heapinfo.c > b/cpukit/libmisc/shell/print_heapinfo.c > index 12bc363..4ac9c96 100644 > --- a/cpukit/libmisc/shell/print_heapinfo.c > +++ b/cpukit/libmisc/shell/print_heapinfo.c > @@ -14,22 +14,47 @@ > #endif > > #include <inttypes.h> > +#include <stdio.h> > > -#include <rtems.h> > -#include <rtems/shell.h> > #include "internal.h" > > void rtems_shell_print_heap_info( > - const char *c, > - Heap_Information *h > + const char *c, > + const Heap_Information *h > ) > { > printf( > - "Number of %s blocks: %" PRId32 "\n" > - "Largest %s block: %" PRId32 "\n" > - "Total bytes %s: %" PRId32 "\n", > + "Number of %s blocks: %12" PRId32 "\n" > + "Largest %s block: %12" PRId32 "\n" > + "Total bytes %s: %12" PRId32 "\n", > c, h->number, > c, h->largest, > c, h->total > ); > } > + > +void rtems_shell_print_heap_stats( > + const Heap_Statistics *s > +) > +{ > + printf( > + "Instance number: %12" PRIu32 "\n" > + "Size of the allocatable area in bytes: %12" PRIuPTR "\n" > + "Minimum free size ever in bytes: %12" PRIuPTR "\n" > + "Maximum number of free blocks ever: %12" PRIu32 "\n" > + "Maximum number of blocks searched ever: %12" PRIu32 "\n" > + "Total number of successful allocations: %12" PRIu32 "\n" > + "Total number of searches ever: %12" PRIu32 "\n" > + "Total number of successful calls to free: %12" PRIu32 "\n" > + "Total number of successful resizes: %12" PRIu32 "\n", > + s->instance, > + s->size, > + s->min_free_size, > + s->max_free_blocks, > + s->max_search, > + s->allocs, > + s->searches, > + s->frees, > + s->resizes > + ); > +} > diff --git a/cpukit/score/include/rtems/score/heap.h > b/cpukit/score/include/rtems/score/heap.h > index 0120a2b..6042a13 100644 > --- a/cpukit/score/include/rtems/score/heap.h > +++ b/cpukit/score/include/rtems/score/heap.h > @@ -313,7 +313,7 @@ typedef struct { > uint32_t searches; > > /** > - * @brief Total number of suceessful calls to free. > + * @brief Total number of successful calls to free. > */ > uint32_t frees; > > @@ -366,6 +366,7 @@ typedef struct { > typedef struct { > Heap_Information Free; > Heap_Information Used; > + Heap_Statistics Stats; > } Heap_Information_block; > > /** > diff --git a/cpukit/score/src/heapgetinfo.c b/cpukit/score/src/heapgetinfo.c > index 8565be4..287d269 100644 > --- a/cpukit/score/src/heapgetinfo.c > +++ b/cpukit/score/src/heapgetinfo.c > @@ -50,4 +50,5 @@ void _Heap_Get_information( > memset( the_info, 0, sizeof(*the_info) ); > _Heap_Protection_free_all_delayed_blocks( the_heap ); > _Heap_Iterate( the_heap, _Heap_Get_information_visitor, the_info ); > + the_info->Stats = the_heap->stats; > } > diff --git a/doc/shell/memory.t b/doc/shell/memory.t > index 0fdf1f8..e8363ae 100644 > --- a/doc/shell/memory.t > +++ b/doc/shell/memory.t > @@ -546,6 +546,15 @@ to the command. This includes the following information: > @item Number of used blocks > @item Largest used block > @item Total bytes used > +@item Instance number > +@item Size of the allocatable area in bytes > +@item Minimum free size ever in bytes > +@item Maximum number of free blocks ever > +@item Maximum number of blocks searched ever > +@item Total number of successful allocations > +@item Total number of searches ever > +@item Total number of successful calls to free > +@item Total number of successful resizes > @end itemize > > When the subcommand @code{walk} is specified, then a heap walk will be > @@ -565,12 +574,22 @@ The following is an example of how to use the > @code{malloc} command. > > @example > SHLL [/] $ malloc > -Number of free blocks: 3 > -Largest free block: 3626672 > -Total bytes free: 3627768 > -Number of used blocks: 130 > -Largest used block: 1048 > -Total bytes used: 10136 > +C Program Heap and RTEMS Workspace are the same. > +Number of free blocks: 14 > +Largest free block: 266157192 > +Total bytes free: 266164928 > +Number of used blocks: 167 > +Largest used block: 16424 > +Total bytes used: 90888 > +Instance number: 0 > +Size of the allocatable area in bytes: 266255816 > +Minimum free size ever in bytes: 266156136 > +Maximum number of free blocks ever: 15 > +Maximum number of blocks searched ever: 15 > +Total number of successful allocations: 186 > +Total number of searches ever: 186 > +Total number of successful calls to free: 19 > +Total number of successful resizes: 0 > SHLL [/] $ malloc walk > malloc walk > PASS[0]: page size 8, min block size 48 > -- > 1.8.4.5 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel