From 896874e9d78150095b958e477cb8e9cb851c2c12 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 2 Mar 2016 19:10:31 -0800 Subject: [PATCH] Switch wakeup to standard list. --- adsbus/wakeup.c | 50 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/adsbus/wakeup.c b/adsbus/wakeup.c index 6ff2695..ed89abd 100644 --- a/adsbus/wakeup.c +++ b/adsbus/wakeup.c @@ -10,6 +10,7 @@ #include #include +#include "list.h" #include "peer.h" #include "rand.h" @@ -19,10 +20,10 @@ struct wakeup_entry { int fd; uint64_t absolute_time_ms; struct peer *peer; - struct wakeup_entry *next; + struct list_head wakeup_list; }; -static struct wakeup_entry *head = NULL; +static struct list_head wakeup_head = LIST_HEAD_INIT(wakeup_head); static uint64_t wakeup_get_time_ms() { struct timespec tp; @@ -38,20 +39,20 @@ void wakeup_init() { } void wakeup_cleanup() { - while (head) { - struct wakeup_entry *next = head->next; - free(head); - head = next; + struct wakeup_entry *iter, *next; + list_for_each_entry_safe(iter, next, &wakeup_head, wakeup_list) { + free(iter); } } int wakeup_get_delay() { - if (!head) { + if (list_is_empty(&wakeup_head)) { return -1; } uint64_t now = wakeup_get_time_ms(); - if (head->absolute_time_ms > now) { - uint64_t delta = head->absolute_time_ms - now; + struct wakeup_entry *next_to_fire = list_entry(wakeup_head.next, struct wakeup_entry, wakeup_list); + if (next_to_fire->absolute_time_ms > now) { + uint64_t delta = next_to_fire->absolute_time_ms - now; assert(delta < INT_MAX); return (int) delta; } else { @@ -61,11 +62,14 @@ int wakeup_get_delay() { void wakeup_dispatch() { uint64_t now = wakeup_get_time_ms(); - while (head && head->absolute_time_ms <= now) { - peer_call(head->peer); - struct wakeup_entry *next = head->next; - free(head); - head = next; + struct wakeup_entry *iter, *next; + list_for_each_entry_safe(iter, next, &wakeup_head, wakeup_list) { + if (iter->absolute_time_ms > now) { + break; + } + peer_call(iter->peer); + list_del(&iter->wakeup_list); + free(iter); } } @@ -74,22 +78,14 @@ void wakeup_add(struct peer *peer, uint32_t delay_ms) { entry->absolute_time_ms = wakeup_get_time_ms() + delay_ms; entry->peer = peer; - struct wakeup_entry *prev = NULL, *iter = head; - while (iter) { + struct wakeup_entry *iter, *next; + list_for_each_entry_safe(iter, next, &wakeup_head, wakeup_list) { if (iter->absolute_time_ms > entry->absolute_time_ms) { - break; + list_add(&entry->wakeup_list, &iter->wakeup_list); + return; } - prev = iter; - iter = iter->next; - } - - if (prev) { - entry->next = prev->next; - prev->next = entry; - } else { - entry->next = head; - head = entry; } + list_add(&entry->wakeup_list, &wakeup_head); } #define RETRY_MIN_MS 2000