From 7b867420658d274a820569ff83784bb2cfa12bc5 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 21 Sep 2024 21:28:41 -0300 Subject: [PATCH] timer: fix time travel --- kernel-src/sys/timer.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/kernel-src/sys/timer.c b/kernel-src/sys/timer.c index e9789113..44ee9bfe 100644 --- a/kernel-src/sys/timer.c +++ b/kernel-src/sys/timer.c @@ -69,6 +69,15 @@ void timer_isr(timer_t *timer, context_t *context) { __assert(timer->queue); + // check if the timer interrupt happened + // while the timer was about to be stopped by a timer_insert or timer_remove + time_t time_passed = timer->stop(timer); + if (time_passed < timer->current_target - timer->tickcurrent) { + arch_e9_puts("bleh bleh\n"); + timer->tickcurrent += time_passed; + goto leave; + } + timer->tickcurrent = timer->current_target; timerentry_t *oldentry = timer->queue; timer->queue = timer->queue->next; @@ -81,6 +90,7 @@ void timer_isr(timer_t *timer, context_t *context) { dpc_enqueue(&oldentry->dpc, oldentry->fn, oldentry->arg); + leave: timercheck(timer); arm_for_next_target(timer);