timer: resume and stop

This commit is contained in:
Matheus
2023-04-24 22:17:35 -03:00
parent ff478b51ed
commit 72744c19b1
2 changed files with 26 additions and 5 deletions
+2 -1
View File
@@ -20,7 +20,8 @@ typedef struct {
time_t (*stop)();
timerentry_t *queue;
} timer_t;
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, time_t us);
timer_t *timer_new(time_t ticksperus, void (*arm)(time_t), time_t (*stop)());
+24 -4
View File
@@ -20,6 +20,30 @@ void timer_isr(timer_t *timer, context_t *context) {
oldentry->func(oldentry->private, context);
}
void timer_resume(timer_t *timer) {
spinlock_acquire(&timer->lock);
if (timer->queue == NULL)
goto leave;
// TODO handle difference being 0
__assert(timer->queue->absolutetick > timer->tickcurrent);
timer->arm(timer->queue->absolutetick - timer->tickcurrent);
leave:
spinlock_release(&timer->lock);
}
void timer_stop(timer_t *timer) {
long oldipl = interrupt_setipl(IPL_TIMER);
spinlock_acquire(&timer->lock);
timer->tickcurrent += timer->stop(timer);
spinlock_release(&timer->lock);
interrupt_setipl(oldipl);
}
void timer_insert(timer_t *timer, timerentry_t* entry, time_t us) {
long oldipl = interrupt_setipl(IPL_TIMER);
spinlock_acquire(&timer->lock);
@@ -52,10 +76,6 @@ void timer_insert(timer_t *timer, timerentry_t* entry, time_t us) {
}
}
// TODO handle this case properly
__assert(timer->queue->absolutetick > timer->tickcurrent);
timer->arm(timer->queue->absolutetick - timer->tickcurrent);
spinlock_release(&timer->lock);
interrupt_setipl(oldipl);
}