mongoose/src/timer.c

37 lines
1.3 KiB
C
Raw Normal View History

2020-12-05 19:26:32 +08:00
// Copyright (c) Cesanta Software Limited
// All rights reserved
#include "timer.h"
#include "arch.h"
void mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,
unsigned flags, void (*fn)(void *), void *arg) {
struct mg_timer tmp = {ms, 0U, 0U, flags, fn, arg, *head};
2020-12-05 19:26:32 +08:00
*t = tmp;
*head = t;
2020-12-05 19:26:32 +08:00
if (flags & MG_TIMER_RUN_NOW) fn(arg);
}
void mg_timer_free(struct mg_timer **head, struct mg_timer *t) {
2020-12-05 19:26:32 +08:00
while (*head && *head != t) head = &(*head)->next;
if (*head) *head = t->next;
}
void mg_timer_poll(struct mg_timer **head, uint64_t now_ms) {
2020-12-05 19:26:32 +08:00
// If time goes back (wrapped around), reset timers
struct mg_timer *t, *tmp;
for (t = *head; t != NULL; t = tmp) {
2020-12-05 19:26:32 +08:00
tmp = t->next;
if (t->prev_ms > now_ms) t->expire = 0; // Handle time wrap
t->prev_ms = now_ms;
2020-12-05 19:26:32 +08:00
if (t->expire == 0) t->expire = now_ms + t->period_ms;
if (t->expire > now_ms) continue;
t->fn(t->arg);
// Try to tick timers with the given period as accurate as possible,
// even if this polling function is called with some random period.
2021-12-22 05:50:18 +08:00
t->expire = now_ms - t->expire > t->period_ms ? now_ms + t->period_ms
: t->expire + t->period_ms;
if (!(t->flags & MG_TIMER_REPEAT)) mg_timer_free(head, t);
2020-12-05 19:26:32 +08:00
}
}