feat(malloc_builtin): add extended memory pool monitoring (#3882)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
This commit is contained in:
_VIFEXTech
2023-01-03 03:20:49 +08:00
committed by GitHub
parent a26da025a4
commit 96c4279929
2 changed files with 45 additions and 11 deletions
+43 -9
View File
@@ -11,6 +11,7 @@
#include "lv_tlsf.h"
#include "lv_assert.h"
#include "lv_log.h"
#include "lv_ll.h"
#include "lv_math.h"
#ifdef LV_MEM_POOL_INCLUDE
@@ -48,6 +49,7 @@ static void lv_mem_walker(void * ptr, size_t size, int used, void * user);
static lv_tlsf_t tlsf;
static uint32_t cur_used;
static uint32_t max_used;
static lv_ll_t pool_ll;
/**********************
* MACROS
@@ -82,6 +84,12 @@ void lv_mem_init_builtin(void)
#else
tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE);
#endif
_lv_ll_init(&pool_ll, sizeof(lv_pool_t));
/*Record the first pool*/
lv_pool_t * pool_p = _lv_ll_ins_tail(&pool_ll);
LV_ASSERT_MALLOC(pool_p);
*pool_p = lv_tlsf_get_pool(tlsf);
#if LV_MEM_ADD_JUNK
LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower");
@@ -90,18 +98,38 @@ void lv_mem_init_builtin(void)
void lv_mem_deinit_builtin(void)
{
_lv_ll_clear(&pool_ll);
lv_tlsf_destroy(tlsf);
lv_mem_init_builtin();
}
lv_mem_builtin_pool_t * lv_mem_builtin_add_pool(void * mem, size_t bytes)
lv_mem_builtin_pool_t lv_mem_builtin_add_pool(void * mem, size_t bytes)
{
return lv_tlsf_add_pool(tlsf, mem, bytes);
lv_mem_builtin_pool_t new_pool = lv_tlsf_add_pool(tlsf, mem, bytes);
if(!new_pool) {
LV_LOG_WARN("failed to add memory pool, address: %p, size: %zu", mem, bytes);
return NULL;
}
lv_pool_t * pool_p = _lv_ll_ins_tail(&pool_ll);
LV_ASSERT_MALLOC(pool_p);
*pool_p = new_pool;
return new_pool;
}
void lv_mem_builtin_remove_pool(lv_mem_builtin_pool_t * pool)
void lv_mem_builtin_remove_pool(lv_mem_builtin_pool_t pool)
{
lv_tlsf_remove_pool(tlsf, pool);
lv_pool_t * pool_p;
_LV_LL_READ(&pool_ll, pool_p) {
if(*pool_p == pool) {
_lv_ll_remove(&pool_ll, pool_p);
lv_free(pool_p);
lv_tlsf_remove_pool(tlsf, pool);
return;
}
}
LV_LOG_WARN("invalid pool: %p", pool);
}
void lv_mem_monitor_builtin(lv_mem_monitor_t * mon_p)
@@ -110,9 +138,11 @@ void lv_mem_monitor_builtin(lv_mem_monitor_t * mon_p)
lv_memset(mon_p, 0, sizeof(lv_mem_monitor_t));
MEM_TRACE("begin");
lv_tlsf_walk_pool(lv_tlsf_get_pool(tlsf), lv_mem_walker, mon_p);
lv_pool_t * pool_p;
_LV_LL_READ(&pool_ll, pool_p) {
lv_tlsf_walk_pool(*pool_p, lv_mem_walker, mon_p);
}
mon_p->total_size = LV_MEM_SIZE;
mon_p->used_pct = 100 - (100U * mon_p->free_size) / mon_p->total_size;
if(mon_p->free_size > 0) {
mon_p->frag_pct = mon_p->free_biggest_size * 100U / mon_p->free_size;
@@ -156,9 +186,12 @@ lv_res_t lv_mem_test_builtin(void)
return LV_RES_INV;
}
if(lv_tlsf_check_pool(lv_tlsf_get_pool(tlsf))) {
LV_LOG_WARN("pool failed");
return LV_RES_INV;
lv_pool_t * pool_p;
_LV_LL_READ(&pool_ll, pool_p) {
if(lv_tlsf_check_pool(*pool_p)) {
LV_LOG_WARN("pool failed");
return LV_RES_INV;
}
}
MEM_TRACE("passed");
@@ -174,6 +207,7 @@ static void lv_mem_walker(void * ptr, size_t size, int used, void * user)
LV_UNUSED(ptr);
lv_mem_monitor_t * mon_p = user;
mon_p->total_size += size;
if(used) {
mon_p->used_cnt++;
}
+2 -2
View File
@@ -46,13 +46,13 @@ void lv_mem_deinit_builtin(void);
* @param bytes memory block size
* @return pointer to lv_mem_builtin_pool handle
*/
lv_mem_builtin_pool_t * lv_mem_builtin_add_pool(void * mem, size_t bytes);
lv_mem_builtin_pool_t lv_mem_builtin_add_pool(void * mem, size_t bytes);
/**
* Remove the memory pool.
* @param lv_mem_builtin_pool_t pointer to lv_mem_builtin_pool handle
*/
void lv_mem_builtin_remove_pool(lv_mem_builtin_pool_t * pool);
void lv_mem_builtin_remove_pool(lv_mem_builtin_pool_t pool);
void * lv_malloc_builtin(size_t size);
void * lv_realloc_builtin(void * p, size_t new_size);