diff options
author | Damien George <damien.p.george@gmail.com> | 2017-03-20 18:42:27 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2017-03-20 18:42:27 +1100 |
commit | 1a5c8d1053b391ea0ce260b882a1f1026ee7a6e0 (patch) | |
tree | 4d4d168028dc0889ff2aa2f81df5ebeb8d6a917c /py | |
parent | 231cfc84a7cae31f93208c334fc33b08278040eb (diff) | |
download | micropython-1a5c8d1053b391ea0ce260b882a1f1026ee7a6e0.tar.gz micropython-1a5c8d1053b391ea0ce260b882a1f1026ee7a6e0.zip |
py/vm: Don't release the GIL if the scheduler is locked.
The scheduler being locked general means we are running a scheduled
function, and switching to another thread violates that, so don't switch in
such a case (even though we technically could).
And if we are running a scheduled function then we want to finish it ASAP,
so we shouldn't switch to another thread.
Furthermore, ports with threading enabled will lock the scheduler during a
hard IRQ, and this patch to the VM will make sure that threads are not
switched during a hard IRQ (which would crash the VM).
Diffstat (limited to 'py')
-rw-r--r-- | py/vm.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -1301,8 +1301,14 @@ pending_exception_check: #else { #endif + #if MICROPY_ENABLE_SCHEDULER + // can only switch threads if the scheduler is unlocked + if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) + #endif + { MP_THREAD_GIL_EXIT(); MP_THREAD_GIL_ENTER(); + } } #endif |