io: update for new timer API.
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 29 Oct 2014 05:59:56 +0000 (16:29 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 30 Oct 2014 22:52:11 +0000 (09:22 +1030)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/io/io.h
ccan/io/poll.c
ccan/io/test/run-15-timeout.c

index 1cf9d609973066c04c696f3412fd735ca241bf5d..ac5a6b077a4b578e776b2a7ac2fa2348c000b530 100644 (file)
@@ -7,6 +7,7 @@
 #include <unistd.h>
 
 struct timers;
 #include <unistd.h>
 
 struct timers;
+struct timer;
 struct list_head;
 
 /**
 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)
 /**
  * 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
  *
  * 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);
  */
  *
  * 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.
 
 /**
  * io_conn_fd - get the fd from a connection.
index 3266bdb2f5c737baecde62870445f90597895cfe..b1a28fdb3f6dbb866b449ac77ddd00cae46d8463 100644 (file)
@@ -222,16 +222,16 @@ static bool handle_always(void)
 }
 
 /* This is the main loop. */
 }
 
 /* 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);
 
 {
        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)
        if (expired)
-               list_head_init(expired);
+               *expired = NULL;
 
        while (!io_loop_return) {
                int i, r, ms_timeout = -1;
 
        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. */
                        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. */
                                break;
 
                        /* Now figure out how long to wait for the next one. */
index e4f3be6d6fffbfa997fd2f670b7ac925fbdbb5ba..5709ddaa8a25416d6bb56c2a7d21ce81688e0e52 100644 (file)
@@ -90,7 +90,7 @@ int main(void)
        struct data *d = malloc(sizeof(*d));
        struct addrinfo *addrinfo;
        struct io_listener *l;
        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 */
        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());
        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);
        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(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(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. */
        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(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));
        ok1(wait(&status));
        ok1(WIFEXITED(status));
        ok1(WEXITSTATUS(status) >= sizeof(d->buf));