diff --git a/src/OSLikeStuff/task_scheduler/task.h b/src/OSLikeStuff/task_scheduler/task.h index 3be9cbdbdb..765f133325 100644 --- a/src/OSLikeStuff/task_scheduler/task.h +++ b/src/OSLikeStuff/task_scheduler/task.h @@ -109,7 +109,7 @@ struct Task { [[nodiscard]] bool isReady(Time currentTime) const { return state == State::READY && isReleased(currentTime) && resourcesAvailable(); }; - [[nodiscard]] bool isRunnable() const { return state == State::READY; } + [[nodiscard]] bool isRunnable() const { return state == State::READY && resourcesAvailable(); } [[nodiscard]] bool isReleased(Time currentTime) const { return currentTime - lastFinishTime > schedule.backOffPeriod; } diff --git a/src/OSLikeStuff/task_scheduler/task_scheduler.cpp b/src/OSLikeStuff/task_scheduler/task_scheduler.cpp index 38ed7898d1..f525973de6 100644 --- a/src/OSLikeStuff/task_scheduler/task_scheduler.cpp +++ b/src/OSLikeStuff/task_scheduler/task_scheduler.cpp @@ -20,7 +20,6 @@ #include "io/debug/log.h" #include "resource_checker.h" #include -#include #if !IN_UNIT_TESTS #include "memory/general_memory_allocator.h" diff --git a/tests/unit/scheduler_tests.cpp b/tests/unit/scheduler_tests.cpp index 6ea9b958e0..9b046a45e7 100644 --- a/tests/unit/scheduler_tests.cpp +++ b/tests/unit/scheduler_tests.cpp @@ -54,6 +54,14 @@ void yield_2ms() { yield([]() { return getTimerValueSeconds(0) > started + Time(0.002); }); } +void yield_2ms_with_lock() { + mock().actualCall("yield_2ms"); + started = getTimerValueSeconds(0); + usbLock = true; + yield([]() { return getTimerValueSeconds(0) > started + Time(0.002); }); + usbLock = false; +} + TEST_GROUP(Scheduler){ void setup(){taskManager = TaskManager(); @@ -234,5 +242,17 @@ TEST(Scheduler, overSchedule) { mock().checkExpectations(); }; +TEST(Scheduler, yield_with_lock) { + mock().clear(); + // will be locked out by the usb lock + mock().expectNCalls(0, "sleep_50ns"); + mock().expectNCalls(1, "yield_2ms"); + // every 1ms sleep for 50ns and 10ns + addRepeatingTask(sleep_50ns, 10, 0.0001, 0.0001, 0.0001, "sleep_50ns", USB); + addOnceTask(yield_2ms_with_lock, 2, 0, "sleep 2ms", USB); + // run the scheduler for 10ms + taskManager.start(0.002); + mock().checkExpectations(); +}; } // namespace