forked from Imagelibrary/rtems
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:
@@ -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
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user