py/mpstate: Make exceptions thread-local.
This moves mp_pending_exception from mp_state_vm_t to mp_state_thread_t. This allows exceptions to be scheduled on a specific thread. Signed-off-by: David Lechner <david@pybricks.com>
This commit is contained in:
committed by
Damien George
parent
7c51cb2307
commit
ca920f7218
@@ -29,7 +29,7 @@
|
||||
#include "py/runtime.h"
|
||||
|
||||
void MICROPY_WRAP_MP_SCHED_EXCEPTION(mp_sched_exception)(mp_obj_t exc) {
|
||||
MP_STATE_VM(mp_pending_exception) = exc;
|
||||
MP_STATE_THREAD(mp_pending_exception) = exc;
|
||||
#if MICROPY_ENABLE_SCHEDULER
|
||||
if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
|
||||
MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
|
||||
@@ -66,9 +66,9 @@ void mp_handle_pending(bool raise_exc) {
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
// Re-check state is still pending now that we're in the atomic section.
|
||||
if (MP_STATE_VM(sched_state) == MP_SCHED_PENDING) {
|
||||
mp_obj_t obj = MP_STATE_VM(mp_pending_exception);
|
||||
mp_obj_t obj = MP_STATE_THREAD(mp_pending_exception);
|
||||
if (obj != MP_OBJ_NULL) {
|
||||
MP_STATE_VM(mp_pending_exception) = MP_OBJ_NULL;
|
||||
MP_STATE_THREAD(mp_pending_exception) = MP_OBJ_NULL;
|
||||
if (!mp_sched_num_pending()) {
|
||||
MP_STATE_VM(sched_state) = MP_SCHED_IDLE;
|
||||
}
|
||||
@@ -115,7 +115,7 @@ void mp_sched_unlock(void) {
|
||||
assert(MP_STATE_VM(sched_state) < 0);
|
||||
if (++MP_STATE_VM(sched_state) == 0) {
|
||||
// vm became unlocked
|
||||
if (MP_STATE_VM(mp_pending_exception) != MP_OBJ_NULL || mp_sched_num_pending()) {
|
||||
if (MP_STATE_THREAD(mp_pending_exception) != MP_OBJ_NULL || mp_sched_num_pending()) {
|
||||
MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
|
||||
} else {
|
||||
MP_STATE_VM(sched_state) = MP_SCHED_IDLE;
|
||||
@@ -148,9 +148,9 @@ bool MICROPY_WRAP_MP_SCHED_SCHEDULE(mp_sched_schedule)(mp_obj_t function, mp_obj
|
||||
|
||||
// A variant of this is inlined in the VM at the pending exception check
|
||||
void mp_handle_pending(bool raise_exc) {
|
||||
if (MP_STATE_VM(mp_pending_exception) != MP_OBJ_NULL) {
|
||||
mp_obj_t obj = MP_STATE_VM(mp_pending_exception);
|
||||
MP_STATE_VM(mp_pending_exception) = MP_OBJ_NULL;
|
||||
if (MP_STATE_THREAD(mp_pending_exception) != MP_OBJ_NULL) {
|
||||
mp_obj_t obj = MP_STATE_THREAD(mp_pending_exception);
|
||||
MP_STATE_THREAD(mp_pending_exception) = MP_OBJ_NULL;
|
||||
if (raise_exc) {
|
||||
nlr_raise(obj);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user