X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftimer%2Ftimer.c;fp=ccan%2Ftimer%2Ftimer.c;h=0abf05cd419ee8111312450872e80b53fee1ebb2;hb=a9d42b8d3bf2b37f47caa428e869fceb4bb33082;hp=c1979fd32d97244a52b930e04ef50bc51733319a;hpb=fe6bc8c530795a6c718f7e8fd1a6643d9f3024a1;p=ccan diff --git a/ccan/timer/timer.c b/ccan/timer/timer.c index c1979fd3..0abf05cd 100644 --- a/ccan/timer/timer.c +++ b/ccan/timer/timer.c @@ -63,8 +63,20 @@ static void timer_add_raw(struct timers *timers, struct timer *t) list_add_tail(l, &t->list); } +void timer_init(struct timer *t) +{ + list_node_init(&t->list); +} + +static bool list_node_initted(const struct list_node *n) +{ + return n->prev == n; +} + void timer_add(struct timers *timers, struct timer *t, struct timeabs when) { + assert(list_node_initted(&t->list)); + t->time = time_to_grains(when); /* Added in the past? Treat it as imminent. */ @@ -79,7 +91,7 @@ void timer_add(struct timers *timers, struct timer *t, struct timeabs when) /* FIXME: inline */ void timer_del(struct timers *timers, struct timer *t) { - list_del(&t->list); + list_del_init(&t->list); } static void timers_far_get(struct timers *timers, @@ -285,6 +297,8 @@ struct timer *timers_expire(struct timers *timers, struct timeabs expire) /* This *may* be NULL, if we deleted the first timer */ t = list_pop(&timers->level[0]->list[off], struct timer, list); + if (t) + list_node_init(&t->list); } while (!t && update_first(timers)); return t;