summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-07-21 10:55:06 +1000
committerDamien George <damien@micropython.org>2023-07-24 15:04:27 +1000
commit8ef5622b9b8cb8caabb138eaf3b1ecccccd882fa (patch)
treec5e2433303edc35e31ef3b660fe696e2c29cf1de /py
parentea1a5e43d08429bed96e251f68f77aa0334bb371 (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.c7
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;
}