From e1776a71e567638d244d8f591d79fa8eb35cc474 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 9 Jul 2023 18:10:31 -0300 Subject: [PATCH] timer: timer_remove --- kernel-src/include/kernel/timer.h | 1 + kernel-src/sys/timer.c | 32 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/kernel-src/include/kernel/timer.h b/kernel-src/include/kernel/timer.h index a30eacca..f06bfd39 100644 --- a/kernel-src/include/kernel/timer.h +++ b/kernel-src/include/kernel/timer.h @@ -30,6 +30,7 @@ void timer_resume(timer_t *timer); void timer_stop(timer_t *timer); void timer_isr(timer_t *timer, context_t *context); void timer_insert(timer_t *timer, timerentry_t *entry, dpcfn_t fn, dpcarg_t arg, time_t us, bool repeating); +void timer_remove(timer_t *timer, timerentry_t *entry); timer_t *timer_new(time_t ticksperus, void (*arm)(time_t), time_t (*stop)()); #endif diff --git a/kernel-src/sys/timer.c b/kernel-src/sys/timer.c index d5d9dae1..306c56e2 100644 --- a/kernel-src/sys/timer.c +++ b/kernel-src/sys/timer.c @@ -102,6 +102,38 @@ void timer_insert(timer_t *timer, timerentry_t *entry, dpcfn_t fn, dpcarg_t arg, interrupt_loweripl(oldipl); } +void timer_remove(timer_t *timer, timerentry_t *entry) { + long oldipl = interrupt_raiseipl(IPL_TIMER); + spinlock_acquire(&timer->lock); + + if (timer->running) + timer->tickcurrent += timer->stop(timer); + + timerentry_t *iterator = timer->queue; + timerentry_t *prev = NULL; + + while (iterator && iterator != entry) { + prev = iterator; + iterator = iterator->next; + } + + __assert(iterator); + + if (prev == NULL) + timer->queue = iterator->next; + else + prev->next = iterator->next; + + if (timer->running) { + // TODO handle difference being 0 + __assert(timer->queue->absolutetick > timer->tickcurrent); + timer->arm(timer->queue->absolutetick - timer->tickcurrent); + } + + spinlock_release(&timer->lock); + interrupt_loweripl(oldipl); +} + timer_t *timer_new(time_t ticksperus, void (*arm)(time_t), time_t (*stop)()) { timer_t *timer = alloc(sizeof(timer_t)); if (timer == NULL)