summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2020-05-27 17:53:31 +1000
committerDamien George <damien.p.george@gmail.com>2020-05-27 17:53:31 +1000
commit4bbba3060d451d4dfa147ebc793acd1cc7364e5a (patch)
tree6356018ffb5eb9630fe848ffaa97dde9a3e3c374
parentd6803067c0a15c03af0639aa02b68898a3f9cc81 (diff)
lib/utils: Lock the scheduler when executing hard callback functions.
Otherwise scheduled functions may execute during the hard callback and then fail if they try to allocate heap memory.
-rw-r--r--lib/utils/mpirq.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/utils/mpirq.c b/lib/utils/mpirq.c
index d04fab68b..8de13b0b6 100644
--- a/lib/utils/mpirq.c
+++ b/lib/utils/mpirq.c
@@ -62,8 +62,10 @@ mp_irq_obj_t *mp_irq_new(const mp_irq_methods_t *methods, mp_obj_t parent) {
void mp_irq_handler(mp_irq_obj_t *self) {
if (self->handler != mp_const_none) {
if (self->ishard) {
- // When executing code within a handler we must lock the GC to prevent
- // any memory allocations.
+ // When executing code within a handler we must lock the scheduler to
+ // prevent any scheduled callbacks from running, and lock the GC to
+ // prevent any memory allocations.
+ mp_sched_lock();
gc_lock();
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
@@ -77,6 +79,7 @@ void mp_irq_handler(mp_irq_obj_t *self) {
mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val));
}
gc_unlock();
+ mp_sched_unlock();
} else {
// Schedule call to user function
mp_sched_schedule(self->handler, self->parent);