Address #1551 - better timers handling

This commit is contained in:
Sergey Lyubka committed 2022-05-15 14:29:34 +01:00
1 parent 443d0f0c6c
commit cf7d1d8041
6 files changed
+48 -38

No files matched your search

+12 -4
View File
@@ -4158,12 +4158,13 @@ size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap) {
#define MG_TIMER_CALLED 4
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};
*t = tmp;
*head = t;
if (flags & MG_TIMER_RUN_NOW) fn(arg);
}
void mg_timer_free(struct mg_timer **head, struct mg_timer *t) {
@@ -4178,14 +4179,21 @@ void mg_timer_poll(struct mg_timer **head, uint64_t now_ms) {
tmp = t->next;
if (t->prev_ms > now_ms) t->expire = 0; // Handle time wrap
t->prev_ms = now_ms;
if (t->expire == 0) t->expire = now_ms + t->period_ms;
if (t->expire == 0 && (t->flags & MG_TIMER_RUN_NOW) &&
!(t->flags & MG_TIMER_CALLED)) {
// Handle MG_TIMER_NOW only once
} else if (t->expire == 0) {
t->expire = now_ms + t->period_ms;
}
if (t->expire > now_ms) continue;
t->fn(t->arg);
if ((t->flags & MG_TIMER_REPEAT) || !(t->flags & MG_TIMER_CALLED)) {
t->fn(t->arg);
}
t->flags |= MG_TIMER_CALLED;
// Try to tick timers with the given period as accurate as possible,
// even if this polling function is called with some random period.
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);
}
}