From 3ea03a118880c9ffb6714049c0907a94b39d31a8 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 27 Dec 2015 19:50:34 +0200 Subject: [PATCH] py/gc: Improve mark/sweep debug output. Previously, mark operation weren't logged at all, while it's quite useful to see cascade of marks in case of over-marking (and in other cases too). Previously, sweep was logged for each block of object in memory, but that doesn't make much sense and just lead to longer output, harder to parse by a human. Instead, log sweep only once per object. This is similar to other memory manager operations, e.g. an object is allocated, then freed. Or object is allocated, then marked, otherwise swept (one log entry per operation, with the same memory address in each case). --- py/gc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py/gc.c b/py/gc.c index a609d4c7cf..4e4cd9f303 100644 --- a/py/gc.c +++ b/py/gc.c @@ -178,6 +178,7 @@ bool gc_is_locked(void) { size_t _block = BLOCK_FROM_PTR(ptr); \ if (ATB_GET_KIND(_block) == AT_HEAD) { \ /* an unmarked head, mark it, and push it on gc stack */ \ + DEBUG_printf("gc_mark(%p)\n", ptr); \ ATB_HEAD_TO_MARK(_block); \ if (MP_STATE_MEM(gc_sp) < &MP_STATE_MEM(gc_stack)[MICROPY_ALLOC_GC_STACK_SIZE]) { \ *MP_STATE_MEM(gc_sp)++ = _block; \ @@ -250,6 +251,7 @@ STATIC void gc_sweep(void) { } #endif free_tail = 1; + DEBUG_printf("gc_sweep(%x)\n", PTR_FROM_BLOCK(block)); #if MICROPY_PY_GC_COLLECT_RETVAL MP_STATE_MEM(gc_collected)++; #endif @@ -257,7 +259,6 @@ STATIC void gc_sweep(void) { case AT_TAIL: if (free_tail) { - DEBUG_printf("gc_sweep(%p)\n",PTR_FROM_BLOCK(block)); ATB_ANY_TO_FREE(block); } break;