summaryrefslogtreecommitdiff
path: root/py/modmicropython.c
diff options
context:
space:
mode:
authorAngus Gratton <angus@redyak.com.au>2024-12-04 10:58:06 +1100
committerDamien George <damien@micropython.org>2025-02-03 15:02:02 +1100
commit40e1c111e17864044190596dff6d32955d11280c (patch)
tree55eb42d4b6a88feedecbc0009ae4a8dbd57faa31 /py/modmicropython.c
parent8a2ff2ca7366f605dd55c93f6b393552b365cd10 (diff)
py/gc: Allow gc_free from inside a gc_sweep finalizer.
Do this by tracking being inside gc collection with a separate flag, GC_COLLECT_FLAG. In gc_free(), ignore this flag when determining if the heap is locked. * For finalisers calling gc_free() when heap is otherwise unlocked, this allows memory to be immediately freed (potentially avoiding a MemoryError). * Hard IRQs still can't call gc_free(), as heap will be locked via gc_lock(). * If finalisers are disabled then all of this code can be compiled out to save some code size. Signed-off-by: Angus Gratton <angus@redyak.com.au>
Diffstat (limited to 'py/modmicropython.c')
-rw-r--r--py/modmicropython.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/py/modmicropython.c b/py/modmicropython.c
index 1bf0a000c..d1a687f10 100644
--- a/py/modmicropython.c
+++ b/py/modmicropython.c
@@ -132,13 +132,13 @@ static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_lock_obj, mp_micropython_he
static mp_obj_t mp_micropython_heap_unlock(void) {
gc_unlock();
- return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth));
+ return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth) >> GC_LOCK_DEPTH_SHIFT);
}
static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_unlock_obj, mp_micropython_heap_unlock);
#if MICROPY_PY_MICROPYTHON_HEAP_LOCKED
static mp_obj_t mp_micropython_heap_locked(void) {
- return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth));
+ return MP_OBJ_NEW_SMALL_INT(MP_STATE_THREAD(gc_lock_depth) >> GC_LOCK_DEPTH_SHIFT);
}
static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_heap_locked_obj, mp_micropython_heap_locked);
#endif