score: Add heap statistics

Add lifetime bytes allocated and freed since they were present in the
malloc statistics.  Add number of failed allocations.
This commit is contained in:
Sebastian Huber
2014-11-28 11:53:55 +01:00
parent 2c3c657625
commit d006b46df3
5 changed files with 59 additions and 23 deletions

View File

@@ -43,17 +43,23 @@ void rtems_shell_print_heap_stats(
"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"
"Lifetime number of bytes allocated: %12" PRIu64 "\n"
"Lifetime number of bytes freed: %12" PRIu64 "\n"
"Total number of searches: %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 failed allocations: %12" PRIu32 "\n"
"Total number of successful frees: %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->lifetime_allocated,
s->lifetime_freed,
s->searches,
s->allocs,
s->failed_allocs,
s->frees,
s->resizes
);

View File

@@ -256,6 +256,20 @@ struct Heap_Block {
* performed on a single allocation call.
*/
typedef struct {
/**
* @brief Lifetime number of bytes allocated from this heap.
*
* This value is an integral multiple of the page size.
*/
uint64_t lifetime_allocated;
/**
* @brief Lifetime number of bytes freed to this heap.
*
* This value is an integral multiple of the page size.
*/
uint64_t lifetime_freed;
/**
* @brief Instance number of this heap.
*/
@@ -302,18 +316,23 @@ typedef struct {
*/
uint32_t max_search;
/**
* @brief Total number of searches.
*/
uint32_t searches;
/**
* @brief Total number of successful allocations.
*/
uint32_t allocs;
/**
* @brief Total number of searches ever.
* @brief Total number of failed allocations.
*/
uint32_t searches;
uint32_t failed_allocs;
/**
* @brief Total number of successful calls to free.
* @brief Total number of successful frees.
*/
uint32_t frees;

View File

@@ -254,10 +254,6 @@ void *_Heap_Allocate_aligned_with_boundary(
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
stats->searches += search_count;
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
_Heap_Check_allocation(
@@ -268,6 +264,14 @@ void *_Heap_Allocate_aligned_with_boundary(
alignment,
boundary
);
/* Statistics */
++stats->allocs;
stats->searches += search_count;
stats->lifetime_allocated += _Heap_Block_size( block );
} else {
/* Statistics */
++stats->failed_allocs;
}
/* Statistics */

View File

@@ -201,6 +201,7 @@ bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
stats->lifetime_freed += block_size;
return( true );
}

View File

@@ -551,9 +551,12 @@ to the command. This includes the following information:
@item Minimum free size ever in bytes
@item Maximum number of free blocks ever
@item Maximum number of blocks searched ever
@item Lifetime number of bytes allocated
@item Lifetime number of bytes freed
@item Total number of searches
@item Total number of successful allocations
@item Total number of searches ever
@item Total number of successful calls to free
@item Total number of failed allocations
@item Total number of successful frees
@item Total number of successful resizes
@end itemize
@@ -575,20 +578,23 @@ The following is an example of how to use the @code{malloc} command.
@example
SHLL [/] $ malloc
C Program Heap and RTEMS Workspace are the same.
Number of free blocks: 14
Largest free block: 266157192
Total bytes free: 266164928
Number of free blocks: 2
Largest free block: 266207504
Total bytes free: 266208392
Number of used blocks: 167
Largest used block: 16424
Total bytes used: 90888
Largest used block: 16392
Total bytes used: 83536
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
Size of the allocatable area in bytes: 266291928
Minimum free size ever in bytes: 266207360
Maximum number of free blocks ever: 6
Maximum number of blocks searched ever: 5
Lifetime number of bytes allocated: 91760
Lifetime number of bytes freed: 8224
Total number of searches: 234
Total number of successful allocations: 186
Total number of searches ever: 186
Total number of successful calls to free: 19
Total number of failed allocations: 0
Total number of successful frees: 19
Total number of successful resizes: 0
SHLL [/] $ malloc walk
malloc walk