diff options
author | Damien George <damien@micropython.org> | 2023-07-21 10:55:06 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2023-07-24 15:04:27 +1000 |
commit | 8ef5622b9b8cb8caabb138eaf3b1ecccccd882fa (patch) | |
tree | c5e2433303edc35e31ef3b660fe696e2c29cf1de /py | |
parent | ea1a5e43d08429bed96e251f68f77aa0334bb371 (diff) |
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 <damien@micropython.org>
Diffstat (limited to 'py')
-rw-r--r-- | py/runtime.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/py/runtime.c b/py/runtime.c index f5d219728..c3ada7229 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; } |