sys: heap: support maximum allocated bytes statistic

Besides the current allocated/free bytes, keep track of
the maximum allocated bytes to help determine the heap
size requirements. Also, provide a function to reset
the statistic.

Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no>
This commit is contained in:
Damian Krolik 2022-03-29 19:07:43 +02:00 committed by Marti Bolivar
commit 5f5410a0cc
4 changed files with 37 additions and 3 deletions

View file

@ -70,6 +70,7 @@ struct z_heap_stress_result {
struct sys_heap_runtime_stats {
size_t free_bytes;
size_t allocated_bytes;
size_t max_allocated_bytes;
};
/**
@ -82,6 +83,17 @@ struct sys_heap_runtime_stats {
int sys_heap_runtime_stats_get(struct sys_heap *heap,
struct sys_heap_runtime_stats *stats);
/**
* @brief Reset the maximum heap usage.
*
* Set the statistic measuring the maximum number of allocated bytes to the
* current number of allocated bytes.
*
* @param heap Pointer to sys_heap
* @return -EINVAL if null pointer was passed, otherwise 0
*/
int sys_heap_runtime_stats_reset_max(struct sys_heap *heap);
#endif
/** @brief Initialize sys_heap

View file

@ -422,6 +422,18 @@ int sys_heap_runtime_stats_get(struct sys_heap *heap,
stats->free_bytes = heap->heap->free_bytes;
stats->allocated_bytes = heap->heap->allocated_bytes;
stats->max_allocated_bytes = heap->heap->max_allocated_bytes;
return 0;
}
int sys_heap_runtime_stats_reset_max(struct sys_heap *heap)
{
if (heap == NULL) {
return -EINVAL;
}
heap->heap->max_allocated_bytes = heap->heap->allocated_bytes;
return 0;
}

View file

@ -10,6 +10,14 @@
#include <string.h>
#include "heap.h"
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
static inline void increase_allocated_bytes(struct z_heap *h, size_t num_bytes)
{
h->allocated_bytes += num_bytes;
h->max_allocated_bytes = MAX(h->max_allocated_bytes, h->allocated_bytes);
}
#endif
static void *chunk_mem(struct z_heap *h, chunkid_t c)
{
chunk_unit_t *buf = chunk_buf(h);
@ -275,7 +283,7 @@ void *sys_heap_alloc(struct sys_heap *heap, size_t bytes)
mem = chunk_mem(h, c);
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
h->allocated_bytes += chunksz_to_bytes(h, chunk_size(h, c));
increase_allocated_bytes(h, chunksz_to_bytes(h, chunk_size(h, c)));
#endif
#ifdef CONFIG_SYS_HEAP_LISTENER
@ -351,7 +359,7 @@ void *sys_heap_aligned_alloc(struct sys_heap *heap, size_t align, size_t bytes)
set_chunk_used(h, c, true);
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
h->allocated_bytes += chunksz_to_bytes(h, chunk_size(h, c));
increase_allocated_bytes(h, chunksz_to_bytes(h, chunk_size(h, c)));
#endif
#ifdef CONFIG_SYS_HEAP_LISTENER
@ -425,7 +433,7 @@ void *sys_heap_aligned_realloc(struct sys_heap *heap, void *ptr,
#endif
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
h->allocated_bytes += split_size * CHUNK_UNIT;
increase_allocated_bytes(h, split_size * CHUNK_UNIT);
#endif
free_list_remove(h, rc);
@ -498,6 +506,7 @@ void sys_heap_init(struct sys_heap *heap, void *mem, size_t bytes)
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
h->free_bytes = 0;
h->allocated_bytes = 0;
h->max_allocated_bytes = 0;
#endif
int nb_buckets = bucket_idx(h, heap_sz) + 1;

View file

@ -72,6 +72,7 @@ struct z_heap {
#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
size_t free_bytes;
size_t allocated_bytes;
size_t max_allocated_bytes;
#endif
struct z_heap_bucket buckets[0];
};