From 8ef5622b9b8cb8caabb138eaf3b1ecccccd882fa Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 21 Jul 2023 10:55:06 +1000 Subject: [PATCH] py/runtime: Always initialise sched_state in mp_init. When MICROPY_SCHEDULER_STATIC_NODES is enabled, the logic is unchanged. When MICROPY_SCHEDULER_STATIC_NODES is disable, sched_state is now always initialised to MP_SCHED_IDLE when calling mp_init(). For example, the use of mp_sched_vm_abort(), if it aborts a running scheduled function, can lead to the scheduler starting off in a locked state when the runtime is restarted, and then it stays locked. This commit fixes that case by resetting sched_state. Signed-off-by: Damien George --- py/runtime.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/py/runtime.c b/py/runtime.c index f5d219728f..c3ada72296 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -69,11 +69,10 @@ void mp_init(void) { // no pending exceptions to start with MP_STATE_THREAD(mp_pending_exception) = MP_OBJ_NULL; #if MICROPY_ENABLE_SCHEDULER + // no pending callbacks to start with + MP_STATE_VM(sched_state) = MP_SCHED_IDLE; #if MICROPY_SCHEDULER_STATIC_NODES - if (MP_STATE_VM(sched_head) == NULL) { - // no pending callbacks to start with - MP_STATE_VM(sched_state) = MP_SCHED_IDLE; - } else { + if (MP_STATE_VM(sched_head) != NULL) { // pending callbacks are on the list, eg from before a soft reset MP_STATE_VM(sched_state) = MP_SCHED_PENDING; }