Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
#include <unistd.h>
struct timers;
#include <unistd.h>
struct timers;
/**
* 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.
}
/* 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. */
- list_head_init(expired);
while (!io_loop_return) {
int i, r, ms_timeout = -1;
while (!io_loop_return) {
int i, r, ms_timeout = -1;
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. */
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;
int fd, status;
/* This is how many tests you plan to run */
int fd, status;
/* This is how many tests you plan to run */
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());
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);
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(d->state == 2);
/* It should have died. */
ok1(d->state == 2);
/* It should have died. */
}
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(wait(&status));
ok1(WIFEXITED(status));
ok1(WEXITSTATUS(status) >= sizeof(d->buf));
ok1(wait(&status));
ok1(WIFEXITED(status));
ok1(WEXITSTATUS(status) >= sizeof(d->buf));