From 3e8aed9fcce9068f40780b23148feaa1e041a18a Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Tue, 5 Sep 2023 10:58:19 +1000 Subject: [PATCH] py/gc: Add "max new split" value in result of gc.mem_free(). Follow-up to 519c24dd487 when MICROPY_GC_SPLIT_HEAP_AUTO is enabled, based on discussion at https://github.com/orgs/micropython/discussions/12316#discussioncomment-6858007 gc.mem_free() is always a heuristic, but this makes it a more useful heuristic for common use cases. Signed-off-by: Angus Gratton --- py/gc.c | 7 ++++++- py/gc.h | 3 +++ py/modgc.c | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/py/gc.c b/py/gc.c index b2e4aa4aae..80e5f80360 100644 --- a/py/gc.c +++ b/py/gc.c @@ -701,6 +701,11 @@ void gc_info(gc_info_t *info) { info->used *= BYTES_PER_BLOCK; info->free *= BYTES_PER_BLOCK; + + #if MICROPY_GC_SPLIT_HEAP_AUTO + info->max_new_split = gc_get_max_new_split(); + #endif + GC_EXIT(); } @@ -1159,7 +1164,7 @@ void gc_dump_info(const mp_print_t *print) { mp_printf(print, "GC: total: %u, used: %u, free: %u", (uint)info.total, (uint)info.used, (uint)info.free); #if MICROPY_GC_SPLIT_HEAP_AUTO - mp_printf(print, ", max new split: %u", (uint)gc_get_max_new_split()); + mp_printf(print, ", max new split: %u", (uint)info.max_new_split); #endif mp_printf(print, "\n No. of 1-blocks: %u, 2-blocks: %u, max blk sz: %u, max free sz: %u\n", (uint)info.num_1block, (uint)info.num_2block, (uint)info.max_block, (uint)info.max_free); diff --git a/py/gc.h b/py/gc.h index 7eec6265c8..3617763306 100644 --- a/py/gc.h +++ b/py/gc.h @@ -75,6 +75,9 @@ typedef struct _gc_info_t { size_t num_1block; size_t num_2block; size_t max_block; + #if MICROPY_GC_SPLIT_HEAP_AUTO + size_t max_new_split; + #endif } gc_info_t; void gc_info(gc_info_t *info); diff --git a/py/modgc.c b/py/modgc.c index c11bcaecd7..7b18045b08 100644 --- a/py/modgc.c +++ b/py/modgc.c @@ -64,7 +64,12 @@ MP_DEFINE_CONST_FUN_OBJ_0(gc_isenabled_obj, gc_isenabled); STATIC mp_obj_t gc_mem_free(void) { gc_info_t info; gc_info(&info); + #if MICROPY_GC_SPLIT_HEAP_AUTO + // Include max_new_split value here as a more useful heuristic + return MP_OBJ_NEW_SMALL_INT(info.free + info.max_new_split); + #else return MP_OBJ_NEW_SMALL_INT(info.free); + #endif } MP_DEFINE_CONST_FUN_OBJ_0(gc_mem_free_obj, gc_mem_free);