From 522ea80f06a80fd799bd57de351373ceaeeae325 Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 31 May 2018 23:10:48 +1000 Subject: [PATCH] py/gc: Add gc_sweep_all() function to run all remaining finalisers. This patch adds the gc_sweep_all() function which does a garbage collection without tracing any root pointers, so frees all the memory, and most importantly runs any remaining finalisers. This helps primarily for soft reset: it will close any open files, any open sockets, and help to get the system back to a clean state upon soft reset. --- py/gc.c | 7 +++++++ py/gc.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/py/gc.c b/py/gc.c index e92b81ece7..0fc43ef495 100644 --- a/py/gc.c +++ b/py/gc.c @@ -362,6 +362,13 @@ void gc_collect_end(void) { GC_EXIT(); } +void gc_sweep_all(void) { + GC_ENTER(); + MP_STATE_MEM(gc_lock_depth)++; + MP_STATE_MEM(gc_stack_overflow) = 0; + gc_collect_end(); +} + void gc_info(gc_info_t *info) { GC_ENTER(); info->total = MP_STATE_MEM(gc_pool_end) - MP_STATE_MEM(gc_pool_start); diff --git a/py/gc.h b/py/gc.h index 739349c1f5..73d86e6c31 100644 --- a/py/gc.h +++ b/py/gc.h @@ -45,6 +45,9 @@ void gc_collect_start(void); void gc_collect_root(void **ptrs, size_t len); void gc_collect_end(void); +// Use this function to sweep the whole heap and run all finalisers +void gc_sweep_all(void); + void *gc_alloc(size_t n_bytes, bool has_finaliser); void gc_free(void *ptr); // does not call finaliser size_t gc_nbytes(const void *ptr);