diff --git a/tests/unix/extra_coverage.py.exp b/tests/unix/extra_coverage.py.exp index 32117aba445b7d71dbc58da3af07984d0d91b984..4169938870c9d184bee974c217ca023d68948f94 100644 --- a/tests/unix/extra_coverage.py.exp +++ b/tests/unix/extra_coverage.py.exp @@ -46,6 +46,17 @@ Warning: test # binary 122 456 +# scheduler +sched(0)=1 +sched(1)=1 +sched(2)=1 +sched(3)=1 +sched(4)=0 +unlocked +3 +2 +1 +0 0123456789 b'0123456789' 7300 7300 diff --git a/unix/coverage.c b/unix/coverage.c index ca236c4303f2b7b828e216070e9ee2110e9b5dba..09959525a0fd4c12d283a6f957d03e02e3942477 100644 --- a/unix/coverage.c +++ b/unix/coverage.c @@ -292,6 +292,35 @@ STATIC mp_obj_t extra_coverage(void) { mp_printf(&mp_plat_print, "%.0lf\n", dar[0]); } + // scheduler + { + mp_printf(&mp_plat_print, "# scheduler\n"); + + // lock scheduler + mp_sched_lock(); + + // schedule multiple callbacks; last one should fail + for (int i = 0; i < 5; ++i) { + mp_printf(&mp_plat_print, "sched(%d)=%d\n", i, mp_sched_schedule(MP_OBJ_FROM_PTR(&mp_builtin_print_obj), MP_OBJ_NEW_SMALL_INT(i))); + } + + // test nested locking/unlocking + mp_sched_lock(); + mp_sched_unlock(); + + // shouldn't do anything while scheduler is locked + mp_handle_pending(); + + // unlock scheduler + mp_sched_unlock(); + mp_printf(&mp_plat_print, "unlocked\n"); + + // drain pending callbacks + while (mp_sched_num_pending()) { + mp_handle_pending(); + } + } + mp_obj_streamtest_t *s = m_new_obj(mp_obj_streamtest_t); s->base.type = &mp_type_stest_fileio; s->buf = NULL; diff --git a/unix/mpconfigport_coverage.h b/unix/mpconfigport_coverage.h index 9df8d0fca80756ce4faf6bea4c61d6c88485b338..387e182db2afe2eb837a9874bd814477e076dcea 100644 --- a/unix/mpconfigport_coverage.h +++ b/unix/mpconfigport_coverage.h @@ -32,6 +32,7 @@ #include <mpconfigport.h> +#define MICROPY_ENABLE_SCHEDULER (1) #define MICROPY_PY_DELATTR_SETATTR (1) #define MICROPY_PY_BUILTINS_HELP (1) #define MICROPY_PY_BUILTINS_HELP_MODULES (1)