py/scheduler: Break out of the c task loop on re-schedule. #17248
+29
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
If a
mp_sched_schedule_node
based C scheduler function re-schedules itself then themp_sched_run_pending
function can get stuck in an infinite loop re-running the function where ctrl-c cannot break out of it anymore.This change adds a unit test to display the behavior (in a self-limiting fashion) along with a minimal change to auto-break out of
mp_sched_run_pending
if the node is re-scheduled. It will still be run on next run ofmp_sched_run_pending
but other aspects of the application / micropython will be able to run as well in this case.See #17246
Testing
Tested on a STM32WB55 with manually broken rfcore, before this it was stuck in an infinite loop trying to init the radio.
Trade-offs and Alternatives
If there are two C scheduled functions that continually re-schedule each other this fix won't catch that, but I tried to keep the minimal fix as simple as possible as I believe the goal is to keep
mp_sched_run_pending
as fast as possible as its run in the interpreter core?