diff options
-rw-r--r-- | core/host/task.c | 36 | ||||
-rw-r--r-- | test/build.mk | 2 |
2 files changed, 34 insertions, 4 deletions
diff --git a/core/host/task.c b/core/host/task.c index 7c9e0622fb..e945b603a8 100644 --- a/core/host/task.c +++ b/core/host/task.c @@ -148,6 +148,23 @@ task_id_t task_get_current(void) return my_task_id; } +static task_id_t task_get_next_wake(void) +{ + int i; + timestamp_t min_time; + int which_task = TASK_ID_INVALID; + + min_time.val = ~0ull; + + for (i = TASK_ID_COUNT - 1; i >= 0; --i) + if (min_time.val >= tasks[i].wake_time.val) { + min_time.val = tasks[i].wake_time.val; + which_task = i; + } + + return which_task; +} + void task_scheduler(void) { int i; @@ -161,8 +178,23 @@ void task_scheduler(void) break; --i; } - if (i < 0) - i = TASK_ID_IDLE; + if (i < 0) { + /* + * No task has event pending, and thus we are only + * waiting for the next wake-up timer to fire. Let's + * just find out which timer is the next and fast + * forward the system time to its deadline. + * + * Note that once we have interrupt support, we need + * to take into account the fact that an interrupt + * might set an event before the next timer fires. + */ + i = task_get_next_wake(); + if (i == TASK_ID_INVALID) + i = TASK_ID_IDLE; + else + force_time(tasks[i].wake_time); + } tasks[i].wake_time.val = ~0ull; pthread_cond_signal(&tasks[i].resume); diff --git a/test/build.mk b/test/build.mk index d3deafc668..a38214b931 100644 --- a/test/build.mk +++ b/test/build.mk @@ -39,7 +39,6 @@ extpwr_gpio-y=extpwr_gpio.o flash-y=flash.o hooks-y=hooks.o kb_8042-y=kb_8042.o -kb_8042-scale=3 kb_mkbp-y=kb_mkbp.o kb_scan-y=kb_scan.o lid_sw-y=lid_sw.o @@ -52,7 +51,6 @@ sbs_charging-y=sbs_charging.o stress-y=stress.o system-y=system.o thermal-y=thermal.o -thermal-scale=200 timer_calib-y=timer_calib.o timer_dos-y=timer_dos.o utils-y=utils.o |