From 10f9d984192a0c2ddbbcb5a950970bc6c55d71a9 Mon Sep 17 00:00:00 2001 From: "Kenji Mouri (Qi Lu)" Date: Sat, 24 Feb 2024 21:06:31 +0800 Subject: [PATCH] fix(stdlib): fix issues when using LVGL TLSF memory pool to manage more than 4 GiB of memory (#5720) --- demos/stress/lv_demo_stress.c | 2 +- examples/widgets/table/lv_example_table_2.c | 4 ++-- src/others/sysmon/lv_sysmon.c | 14 +++++++------- src/stdlib/builtin/lv_tlsf.h | 6 +++--- src/stdlib/lv_mem.c | 12 ++++++------ src/stdlib/lv_mem.h | 14 +++++++------- tests/src/lv_test_helpers.h | 2 +- tests/src/test_cases/cache/test_cache.c | 2 +- tests/src/test_cases/libs/test_libjpeg_turbo.c | 2 +- tests/src/test_cases/libs/test_libpng.c | 2 +- tests/src/test_cases/libs/test_lodepng.c | 2 +- tests/src/test_cases/libs/test_tjpgd.c | 2 +- tests/src/test_cases/test_demo_stress.c | 2 +- tests/src/test_cases/test_event.c | 2 +- tests/src/test_cases/test_snapshot.c | 4 ++-- tests/src/test_cases/widgets/test_checkbox.c | 2 +- tests/src/test_cases/widgets/test_dropdown.c | 2 +- tests/src/test_cases/widgets/test_switch.c | 2 +- 18 files changed, 39 insertions(+), 39 deletions(-) diff --git a/demos/stress/lv_demo_stress.c b/demos/stress/lv_demo_stress.c index b6dfd2fc4..1ca3f2250 100644 --- a/demos/stress/lv_demo_stress.c +++ b/demos/stress/lv_demo_stress.c @@ -78,7 +78,7 @@ static void obj_test_task_cb(lv_timer_t * tmr) if(mem_free_start == 0) mem_free_start = mon.free_size; - LV_LOG_USER("mem leak since start: %" LV_PRIu32 ", frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct); + LV_LOG_USER("mem leak since start: %zu, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct); } break; case 0: diff --git a/examples/widgets/table/lv_example_table_2.c b/examples/widgets/table/lv_example_table_2.c index c11dd25e3..972d4dac8 100644 --- a/examples/widgets/table/lv_example_table_2.c +++ b/examples/widgets/table/lv_example_table_2.c @@ -92,13 +92,13 @@ void lv_example_table_2(void) lv_mem_monitor_t mon2; lv_mem_monitor(&mon2); - uint32_t mem_used = mon1.free_size - mon2.free_size; + size_t mem_used = mon1.free_size - mon2.free_size; uint32_t elaps = lv_tick_elaps(t); lv_obj_t * label = lv_label_create(lv_screen_active()); lv_label_set_text_fmt(label, "%"LV_PRIu32" items were created in %"LV_PRIu32" ms\n" - "using %"LV_PRIu32" bytes of memory", + "using %zu bytes of memory", (uint32_t)ITEM_CNT, elaps, mem_used); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -10); diff --git a/src/others/sysmon/lv_sysmon.c b/src/others/sysmon/lv_sysmon.c index 246706c5e..a9f311fbc 100644 --- a/src/others/sysmon/lv_sysmon.c +++ b/src/others/sysmon/lv_sysmon.c @@ -268,14 +268,14 @@ static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject) lv_obj_t * label = lv_observer_get_target(observer); const lv_mem_monitor_t * mon = lv_subject_get_pointer(subject); - uint32_t used_size = mon->total_size - mon->free_size;; - uint32_t used_kb = used_size / 1024; - uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; - uint32_t max_used_kb = mon->max_used / 1024; - uint32_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102; + size_t used_size = mon->total_size - mon->free_size;; + size_t used_kb = used_size / 1024; + size_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; + size_t max_used_kb = mon->max_used / 1024; + size_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102; lv_label_set_text_fmt(label, - "%"LV_PRIu32 ".%"LV_PRIu32 " kB (%d%%)\n" - "%"LV_PRIu32 ".%"LV_PRIu32 " kB max, %d%% frag.", + "%zu.%zu kB (%d%%)\n" + "%zu.%zu kB max, %d%% frag.", used_kb, used_kb_tenth, mon->used_pct, max_used_kb, max_used_kb_tenth, mon->frag_pct); diff --git a/src/stdlib/builtin/lv_tlsf.h b/src/stdlib/builtin/lv_tlsf.h index 0fa6decbe..98126636a 100644 --- a/src/stdlib/builtin/lv_tlsf.h +++ b/src/stdlib/builtin/lv_tlsf.h @@ -1,4 +1,4 @@ -#include "../../lv_conf_internal.h" +#include "../../lv_conf_internal.h" #if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN #ifndef LV_TLSF_H @@ -60,8 +60,8 @@ typedef struct { lv_mutex_t mutex; #endif lv_tlsf_t tlsf; - uint32_t cur_used; - uint32_t max_used; + size_t cur_used; + size_t max_used; lv_ll_t pool_ll; } lv_tlsf_state_t; diff --git a/src/stdlib/lv_mem.c b/src/stdlib/lv_mem.c index 95c1fcb17..c1ab647e3 100644 --- a/src/stdlib/lv_mem.c +++ b/src/stdlib/lv_mem.c @@ -74,9 +74,9 @@ void * lv_malloc(size_t size) #if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO lv_mem_monitor_t mon; lv_mem_monitor(&mon); - LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d", - (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct, - (int)mon.free_biggest_size); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); #endif return NULL; } @@ -103,9 +103,9 @@ void * lv_malloc_zeroed(size_t size) #if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO lv_mem_monitor_t mon; lv_mem_monitor(&mon); - LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d", - (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct, - (int)mon.free_biggest_size); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); #endif return NULL; } diff --git a/src/stdlib/lv_mem.h b/src/stdlib/lv_mem.h index 48a176379..f66f3d6f0 100644 --- a/src/stdlib/lv_mem.h +++ b/src/stdlib/lv_mem.h @@ -1,4 +1,4 @@ -/** +/** * @file lv_mem.h * */ @@ -35,12 +35,12 @@ typedef void * lv_mem_pool_t; * Heap information structure. */ typedef struct { - uint32_t total_size; /**< Total heap size*/ - uint32_t free_cnt; - uint32_t free_size; /**< Size of available memory*/ - uint32_t free_biggest_size; - uint32_t used_cnt; - uint32_t max_used; /**< Max size of Heap memory used*/ + size_t total_size; /**< Total heap size*/ + size_t free_cnt; + size_t free_size; /**< Size of available memory*/ + size_t free_biggest_size; + size_t used_cnt; + size_t max_used; /**< Max size of Heap memory used*/ uint8_t used_pct; /**< Percentage used*/ uint8_t frag_pct; /**< Amount of fragmentation*/ } lv_mem_monitor_t; diff --git a/tests/src/lv_test_helpers.h b/tests/src/lv_test_helpers.h index c24d85957..5f155567c 100644 --- a/tests/src/lv_test_helpers.h +++ b/tests/src/lv_test_helpers.h @@ -12,7 +12,7 @@ #else #define LV_HEAP_CHECK(x) x -static inline uint32_t lv_test_get_free_mem(void) +static inline size_t lv_test_get_free_mem(void) { lv_mem_monitor_t m1; lv_mem_monitor(&m1); diff --git a/tests/src/test_cases/cache/test_cache.c b/tests/src/test_cases/cache/test_cache.c index d54ee3b6d..12a87becd 100644 --- a/tests/src/test_cases/cache/test_cache.c +++ b/tests/src/test_cases/cache/test_cache.c @@ -127,7 +127,7 @@ void test_cache_1(void) * Now drop the cache {key1 = 32, key2 = 33}. However, this entry is acquired once without release, so `drop` * will not release the memory allocated by this entry. */ - uint32_t mem_curr_free = lv_test_get_free_mem(); + size_t mem_curr_free = lv_test_get_free_mem(); lv_cache_drop(cache, &search_key32, NULL); /* * Though it doesn't release the data, the entry and other structure has been freed. diff --git a/tests/src/test_cases/libs/test_libjpeg_turbo.c b/tests/src/test_cases/libs/test_libjpeg_turbo.c index 3b7d64264..4db54af4e 100644 --- a/tests/src/test_cases/libs/test_libjpeg_turbo.c +++ b/tests/src/test_cases/libs/test_libjpeg_turbo.c @@ -34,7 +34,7 @@ void test_jpg_2(void) TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_2.png"); - uint32_t mem_before = lv_test_get_free_mem(); + size_t mem_before = lv_test_get_free_mem(); for(uint32_t i = 0; i < 20; i++) { create_images(); diff --git a/tests/src/test_cases/libs/test_libpng.c b/tests/src/test_cases/libs/test_libpng.c index b00d58565..e638aaace 100644 --- a/tests/src/test_cases/libs/test_libpng.c +++ b/tests/src/test_cases/libs/test_libpng.c @@ -34,7 +34,7 @@ void test_libpng_1(void) TEST_ASSERT_EQUAL_SCREENSHOT("libs/png_2.png"); - uint32_t mem_before = lv_test_get_free_mem(); + size_t mem_before = lv_test_get_free_mem(); for(uint32_t i = 0; i < 20; i++) { create_images(); diff --git a/tests/src/test_cases/libs/test_lodepng.c b/tests/src/test_cases/libs/test_lodepng.c index ce68cec0e..72b20312a 100644 --- a/tests/src/test_cases/libs/test_lodepng.c +++ b/tests/src/test_cases/libs/test_lodepng.c @@ -59,7 +59,7 @@ void test_lodepng_1(void) TEST_ASSERT_EQUAL_SCREENSHOT("libs/png_1.png"); - uint32_t mem_before = lv_test_get_free_mem(); + size_t mem_before = lv_test_get_free_mem(); for(uint32_t i = 0; i < 20; i++) { create_images(); diff --git a/tests/src/test_cases/libs/test_tjpgd.c b/tests/src/test_cases/libs/test_tjpgd.c index c5983e628..48198e3db 100644 --- a/tests/src/test_cases/libs/test_tjpgd.c +++ b/tests/src/test_cases/libs/test_tjpgd.c @@ -48,7 +48,7 @@ void test_tjpgd_1(void) TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_1.png"); - uint32_t mem_before = lv_test_get_free_mem(); + size_t mem_before = lv_test_get_free_mem(); for(uint32_t i = 0; i < 20; i++) { create_images(); diff --git a/tests/src/test_cases/test_demo_stress.c b/tests/src/test_cases/test_demo_stress.c index 087ca6c3b..3eb09ee27 100644 --- a/tests/src/test_cases/test_demo_stress.c +++ b/tests/src/test_cases/test_demo_stress.c @@ -26,7 +26,7 @@ void test_demo_stress(void) #endif /* loop once to allow objects to be created */ loop_through_stress_test(); - uint32_t mem_before = lv_test_get_free_mem(); + size_t mem_before = lv_test_get_free_mem(); /* loop 5 more times */ for(uint32_t i = 0; i < 5; i++) { loop_through_stress_test(); diff --git a/tests/src/test_cases/test_event.c b/tests/src/test_cases/test_event.c index 79ddac824..f827f5686 100644 --- a/tests/src/test_cases/test_event.c +++ b/tests/src/test_cases/test_event.c @@ -29,7 +29,7 @@ void test_event_should_not_memory_lean(void) lv_mem_monitor_t monitor; lv_mem_monitor(&monitor); lv_obj_t * obj = lv_obj_create(lv_screen_active()); - uint32_t initial_free_size = monitor.free_size; + size_t initial_free_size = monitor.free_size; for(int i = 0; i < 10; i++) { lv_obj_add_event_cb(obj, NULL, LV_EVENT_ALL, NULL); diff --git a/tests/src/test_cases/test_snapshot.c b/tests/src/test_cases/test_snapshot.c index 6b45cc00d..2d0aab21b 100644 --- a/tests/src/test_cases/test_snapshot.c +++ b/tests/src/test_cases/test_snapshot.c @@ -10,8 +10,8 @@ void test_snapshot_should_not_leak_memory(void) { uint32_t idx = 0; - uint32_t initial_available_memory = 0; - uint32_t final_available_memory = 0; + size_t initial_available_memory = 0; + size_t final_available_memory = 0; lv_mem_monitor_t monitor; lv_draw_buf_t * snapshots[NUM_SNAPSHOTS] = {NULL}; diff --git a/tests/src/test_cases/widgets/test_checkbox.c b/tests/src/test_cases/widgets/test_checkbox.c index 23e4bad4e..e006f946d 100644 --- a/tests/src/test_cases/widgets/test_checkbox.c +++ b/tests/src/test_cases/widgets/test_checkbox.c @@ -75,7 +75,7 @@ void test_checkbox_should_return_dynamically_allocated_text(void) void test_checkbox_should_allocate_memory_for_static_text(void) { - uint32_t initial_available_memory = 0; + size_t initial_available_memory = 0; const char * static_text = "Keep me while you exist"; lv_mem_monitor_t m1; diff --git a/tests/src/test_cases/widgets/test_dropdown.c b/tests/src/test_cases/widgets/test_dropdown.c index b6c6bdd87..a32aaebac 100644 --- a/tests/src/test_cases/widgets/test_dropdown.c +++ b/tests/src/test_cases/widgets/test_dropdown.c @@ -110,7 +110,7 @@ void test_dropdown_set_options(void) lv_mem_monitor_t m2; lv_mem_monitor(&m2); - TEST_ASSERT_UINT32_WITHIN(48, m1.free_size, m2.free_size); + TEST_ASSERT_UINT_WITHIN(48, m1.free_size, m2.free_size); } void test_dropdown_select(void) diff --git a/tests/src/test_cases/widgets/test_switch.c b/tests/src/test_cases/widgets/test_switch.c index 0e22fe3ce..194a07af5 100644 --- a/tests/src/test_cases/widgets/test_switch.c +++ b/tests/src/test_cases/widgets/test_switch.c @@ -49,7 +49,7 @@ void test_switch_should_have_default_state_after_being_created(void) void test_switch_should_not_leak_memory_after_deletion(void) { size_t idx = 0; - uint32_t initial_available_memory = 0; + size_t initial_available_memory = 0; lv_obj_t * switches[SWITCHES_CNT] = {NULL}; initial_available_memory = lv_test_get_free_mem();