Browse Source

io: update for new timer API.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 11 years ago
parent
commit
36bfb66bdf
3 changed files with 16 additions and 14 deletions
  1. 5 4
      ccan/io/io.h
  2. 5 5
      ccan/io/poll.c
  3. 6 5
      ccan/io/test/run-15-timeout.c

+ 5 - 4
ccan/io/io.h

@@ -7,6 +7,7 @@
 #include <unistd.h>
 
 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.

+ 5 - 5
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. */

+ 6 - 5
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));