X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftimer%2Ftimer.c;h=0d7deb127748b3130a1270f75ebc6ecec1fbf583;hb=897219d64e60ff6bbe7b08c0425b6741cb5f7a94;hp=c1979fd32d97244a52b930e04ef50bc51733319a;hpb=fe6bc8c530795a6c718f7e8fd1a6643d9f3024a1;p=ccan diff --git a/ccan/timer/timer.c b/ccan/timer/timer.c index c1979fd3..0d7deb12 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; @@ -346,7 +360,7 @@ struct timers *timers_check(const struct timers *timers, const char *abortstr) /* For other levels, "current" bucket has been emptied, and may contain * entries for the current + level_size bucket. */ - for (l = 1; timers->level[l] && l < PER_LEVEL; l++) { + for (l = 1; l < ARRAY_SIZE(timers->level) && timers->level[l]; l++) { uint64_t per_bucket = 1ULL << (TIMER_LEVEL_BITS * l); off = ((timers->base >> (l*TIMER_LEVEL_BITS)) % PER_LEVEL);