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"
|
"Minimum free size ever in bytes: %12" PRIuPTR "\n"
|
||||||
"Maximum number of free blocks ever: %12" PRIu32 "\n"
|
"Maximum number of free blocks ever: %12" PRIu32 "\n"
|
||||||
"Maximum number of blocks searched 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 successful allocations: %12" PRIu32 "\n"
|
||||||
"Total number of searches ever: %12" PRIu32 "\n"
|
"Total number of failed allocations: %12" PRIu32 "\n"
|
||||||
"Total number of successful calls to free: %12" PRIu32 "\n"
|
"Total number of successful frees: %12" PRIu32 "\n"
|
||||||
"Total number of successful resizes: %12" PRIu32 "\n",
|
"Total number of successful resizes: %12" PRIu32 "\n",
|
||||||
s->instance,
|
s->instance,
|
||||||
s->size,
|
s->size,
|
||||||
s->min_free_size,
|
s->min_free_size,
|
||||||
s->max_free_blocks,
|
s->max_free_blocks,
|
||||||
s->max_search,
|
s->max_search,
|
||||||
s->allocs,
|
s->lifetime_allocated,
|
||||||
|
s->lifetime_freed,
|
||||||
s->searches,
|
s->searches,
|
||||||
|
s->allocs,
|
||||||
|
s->failed_allocs,
|
||||||
s->frees,
|
s->frees,
|
||||||
s->resizes
|
s->resizes
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -256,6 +256,20 @@ struct Heap_Block {
|
|||||||
* performed on a single allocation call.
|
* performed on a single allocation call.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
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.
|
* @brief Instance number of this heap.
|
||||||
*/
|
*/
|
||||||
@@ -302,18 +316,23 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
uint32_t max_search;
|
uint32_t max_search;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Total number of searches.
|
||||||
|
*/
|
||||||
|
uint32_t searches;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Total number of successful allocations.
|
* @brief Total number of successful allocations.
|
||||||
*/
|
*/
|
||||||
uint32_t allocs;
|
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;
|
uint32_t frees;
|
||||||
|
|
||||||
|
|||||||
@@ -254,10 +254,6 @@ void *_Heap_Allocate_aligned_with_boundary(
|
|||||||
} while ( search_again );
|
} while ( search_again );
|
||||||
|
|
||||||
if ( alloc_begin != 0 ) {
|
if ( alloc_begin != 0 ) {
|
||||||
/* Statistics */
|
|
||||||
++stats->allocs;
|
|
||||||
stats->searches += search_count;
|
|
||||||
|
|
||||||
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
|
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
|
||||||
|
|
||||||
_Heap_Check_allocation(
|
_Heap_Check_allocation(
|
||||||
@@ -268,6 +264,14 @@ void *_Heap_Allocate_aligned_with_boundary(
|
|||||||
alignment,
|
alignment,
|
||||||
boundary
|
boundary
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Statistics */
|
||||||
|
++stats->allocs;
|
||||||
|
stats->searches += search_count;
|
||||||
|
stats->lifetime_allocated += _Heap_Block_size( block );
|
||||||
|
} else {
|
||||||
|
/* Statistics */
|
||||||
|
++stats->failed_allocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Statistics */
|
/* Statistics */
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
|
|||||||
--stats->used_blocks;
|
--stats->used_blocks;
|
||||||
++stats->frees;
|
++stats->frees;
|
||||||
stats->free_size += block_size;
|
stats->free_size += block_size;
|
||||||
|
stats->lifetime_freed += block_size;
|
||||||
|
|
||||||
return( true );
|
return( true );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -551,9 +551,12 @@ to the command. This includes the following information:
|
|||||||
@item Minimum free size ever in bytes
|
@item Minimum free size ever in bytes
|
||||||
@item Maximum number of free blocks ever
|
@item Maximum number of free blocks ever
|
||||||
@item Maximum number of blocks searched 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 successful allocations
|
||||||
@item Total number of searches ever
|
@item Total number of failed allocations
|
||||||
@item Total number of successful calls to free
|
@item Total number of successful frees
|
||||||
@item Total number of successful resizes
|
@item Total number of successful resizes
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@@ -575,20 +578,23 @@ The following is an example of how to use the @code{malloc} command.
|
|||||||
@example
|
@example
|
||||||
SHLL [/] $ malloc
|
SHLL [/] $ malloc
|
||||||
C Program Heap and RTEMS Workspace are the same.
|
C Program Heap and RTEMS Workspace are the same.
|
||||||
Number of free blocks: 14
|
Number of free blocks: 2
|
||||||
Largest free block: 266157192
|
Largest free block: 266207504
|
||||||
Total bytes free: 266164928
|
Total bytes free: 266208392
|
||||||
Number of used blocks: 167
|
Number of used blocks: 167
|
||||||
Largest used block: 16424
|
Largest used block: 16392
|
||||||
Total bytes used: 90888
|
Total bytes used: 83536
|
||||||
Instance number: 0
|
Instance number: 0
|
||||||
Size of the allocatable area in bytes: 266255816
|
Size of the allocatable area in bytes: 266291928
|
||||||
Minimum free size ever in bytes: 266156136
|
Minimum free size ever in bytes: 266207360
|
||||||
Maximum number of free blocks ever: 15
|
Maximum number of free blocks ever: 6
|
||||||
Maximum number of blocks searched ever: 15
|
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 successful allocations: 186
|
||||||
Total number of searches ever: 186
|
Total number of failed allocations: 0
|
||||||
Total number of successful calls to free: 19
|
Total number of successful frees: 19
|
||||||
Total number of successful resizes: 0
|
Total number of successful resizes: 0
|
||||||
SHLL [/] $ malloc walk
|
SHLL [/] $ malloc walk
|
||||||
malloc walk
|
malloc walk
|
||||||
|
|||||||
Reference in New Issue
Block a user