From: Rusty Russell Date: Wed, 29 Oct 2014 05:59:56 +0000 (+1030) Subject: io: update for new timer API. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=36bfb66bdf74f4f3382cd00dae7b899e80e2cf1a;ds=sidebyside io: update for new timer API. Signed-off-by: Rusty Russell --- diff --git a/ccan/io/io.h b/ccan/io/io.h index 1cf9d609..ac5a6b07 100644 --- a/ccan/io/io.h +++ b/ccan/io/io.h @@ -7,6 +7,7 @@ #include struct timers; +struct timer; struct list_head; /** @@ -629,16 +630,16 @@ struct io_plan *io_close_cb(struct io_conn *, void *unused); /** * io_loop - process fds until all closed on io_break. * @timers - timers which are waiting to go off (or NULL for none) - * @expired - a list filled with expired timers (can be NULL if @timers is) + * @expired - an expired timer (can be NULL if @timers is) * * This is the core loop; it exits with the io_break() arg, or NULL if - * all connections and listeners are closed, or with @expired set to a - * list of expired timers (if @timers isn't NULL). + * all connections and listeners are closed, or with @expired set to an + * expired timer (if @timers isn't NULL). * * Example: * io_loop(NULL, NULL); */ -void *io_loop(struct timers *timers, struct list_head *expired); +void *io_loop(struct timers *timers, struct timer **expired); /** * io_conn_fd - get the fd from a connection. diff --git a/ccan/io/poll.c b/ccan/io/poll.c index 3266bdb2..b1a28fdb 100644 --- a/ccan/io/poll.c +++ b/ccan/io/poll.c @@ -222,16 +222,16 @@ static bool handle_always(void) } /* This is the main loop. */ -void *io_loop(struct timers *timers, struct list_head *expired) +void *io_loop(struct timers *timers, struct timer **expired) { void *ret; /* if timers is NULL, expired must be. If not, not. */ assert(!timers == !expired); - /* Make sure this is empty if we exit for some other reason. */ + /* Make sure this is NULL if we exit for some other reason. */ if (expired) - list_head_init(expired); + *expired = NULL; while (!io_loop_return) { int i, r, ms_timeout = -1; @@ -259,8 +259,8 @@ void *io_loop(struct timers *timers, struct list_head *expired) now = time_now(); /* Call functions for expired timers. */ - timers_expire(timers, now, expired); - if (!list_empty(expired)) + *expired = timers_expire(timers, now); + if (*expired) break; /* Now figure out how long to wait for the next one. */ diff --git a/ccan/io/test/run-15-timeout.c b/ccan/io/test/run-15-timeout.c index e4f3be6d..5709ddaa 100644 --- a/ccan/io/test/run-15-timeout.c +++ b/ccan/io/test/run-15-timeout.c @@ -90,7 +90,7 @@ int main(void) struct data *d = malloc(sizeof(*d)); struct addrinfo *addrinfo; struct io_listener *l; - struct list_head expired; + struct timer *expired; int fd, status; /* This is how many tests you plan to run */ @@ -98,6 +98,7 @@ int main(void) d->state = 0; d->timeout_usec = 100000; timers_init(&d->timers, time_now()); + timer_init(&d->timer); fd = make_listen_fd(PORT, &addrinfo); ok1(fd >= 0); l = io_new_listener(NULL, fd, init_conn, d); @@ -129,15 +130,15 @@ int main(void) ok1(io_loop(&d->timers, &expired) == NULL); /* One element, d->timer. */ - ok1(list_pop(&expired, struct timer, list) == &d->timer); - ok1(list_empty(&expired)); + ok1(expired == &d->timer); + ok1(!timers_expire(&d->timers, time_now())); ok1(d->state == 1); io_close(d->conn); /* Finished will be called, d will be returned */ ok1(io_loop(&d->timers, &expired) == d); - ok1(list_empty(&expired)); + ok1(expired == NULL); ok1(d->state == 2); /* It should have died. */ @@ -174,7 +175,7 @@ int main(void) } ok1(io_loop(&d->timers, &expired) == d); ok1(d->state == 3); - ok1(list_empty(&expired)); + ok1(expired == NULL); ok1(wait(&status)); ok1(WIFEXITED(status)); ok1(WEXITSTATUS(status) >= sizeof(d->buf));