From 3653f5144a9ad719f70e2d310e218cf724afc822 Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 5 May 2016 10:25:08 +0000 Subject: [PATCH] py/gc: Fix GC+thread bug where ptr gets lost because it's not computed. GC_EXIT() can cause a pending thread (waiting on the mutex) to be scheduled right away. This other thread may trigger a garbage collection. If the pointer to the newly-allocated block (allocated by the original thread) is not computed before the switch (so it's just left as a block number) then the block will be wrongly reclaimed. This patch makes sure the pointer is computed before allowing any thread switch to occur. --- py/gc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/py/gc.c b/py/gc.c index a40b9878f9..86ed0ce30e 100644 --- a/py/gc.c +++ b/py/gc.c @@ -434,12 +434,13 @@ found: ATB_FREE_TO_TAIL(bl); } - GC_EXIT(); - // get pointer to first block + // we must create this pointer before unlocking the GC so a collection can find it void *ret_ptr = (void*)(MP_STATE_MEM(gc_pool_start) + start_block * BYTES_PER_BLOCK); DEBUG_printf("gc_alloc(%p)\n", ret_ptr); + GC_EXIT(); + // zero out the additional bytes of the newly allocated blocks // This is needed because the blocks may have previously held pointers // to the heap and will not be set to something else if the caller