[PATCH 2/2] score: Return heap stats via _Heap_Get_information
Gedare Bloom
gedare at rtems.org
Thu Nov 27 15:38:52 UTC 2014
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.huber at 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
> + at item Instance number
> + at item Size of the allocatable area in bytes
> + at item Minimum free size ever in bytes
> + at item Maximum number of free blocks ever
> + at item Maximum number of blocks searched ever
> + at item Total number of successful allocations
> + at item Total number of searches ever
> + at item Total number of successful calls to free
> + at 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 at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list