X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Ftest%2Frun-15-timeout.c;h=e4f3be6d6fffbfa997fd2f670b7ac925fbdbb5ba;hb=d8ecdc8021b532fe76f001290fcd79c4fb9e1323;hp=6f92ec3a634848c0770fcd21016e56acfb082274;hpb=13b38a7282c6043d6abe310e5a16d6610ed7a1c1;p=ccan diff --git a/ccan/io/test/run-15-timeout.c b/ccan/io/test/run-15-timeout.c index 6f92ec3a..e4f3be6d 100644 --- a/ccan/io/test/run-15-timeout.c +++ b/ccan/io/test/run-15-timeout.c @@ -3,54 +3,54 @@ #include #include #include +#include #include #include #include -#ifndef PORT +#ifdef DEBUG_CONN +#define PORT "64015" +#else #define PORT "65015" #endif struct data { + struct timers timers; int state; + struct io_conn *conn; + struct timer timer; int timeout_usec; - bool timed_out; char buf[4]; }; - -static struct io_plan no_timeout(struct io_conn *conn, struct data *d) +static void finish_ok(struct io_conn *conn, struct data *d) { - ok1(d->state == 1); d->state++; - return io_close(); + io_break(d); } -static struct io_plan timeout(struct io_conn *conn, struct data *d) +static struct io_plan *no_timeout(struct io_conn *conn, struct data *d) { ok1(d->state == 1); d->state++; - d->timed_out = true; - return io_close(); + return io_close(conn); } -static void finish_ok(struct io_conn *conn, struct data *d) +static struct io_plan *init_conn(struct io_conn *conn, struct data *d) { - ok1(d->state == 2); - d->state++; - io_break(d, io_idle()); -} - -static void init_conn(int fd, struct data *d) -{ - struct io_conn *conn; - +#ifdef DEBUG_CONN + io_set_debug(conn, true); +#endif ok1(d->state == 0); d->state++; - conn = io_new_conn(fd, io_read(d->buf, sizeof(d->buf), no_timeout, d)); + d->conn = conn; io_set_finish(conn, finish_ok, d); - io_timeout(conn, time_from_usec(d->timeout_usec), timeout, d); + + timer_add(&d->timers, &d->timer, + timeabs_add(time_now(), time_from_usec(d->timeout_usec))); + + return io_read(conn, d->buf, sizeof(d->buf), no_timeout, d); } static int make_listen_fd(const char *port, struct addrinfo **info) @@ -90,16 +90,17 @@ int main(void) 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 */ - plan_tests(20); + plan_tests(21); d->state = 0; - d->timed_out = false; d->timeout_usec = 100000; + timers_init(&d->timers, time_now()); fd = make_listen_fd(PORT, &addrinfo); ok1(fd >= 0); - l = io_new_listener(fd, init_conn, d); + l = io_new_listener(NULL, fd, init_conn, d); ok1(l); fflush(stdout); @@ -121,19 +122,31 @@ int main(void) } close(fd); freeaddrinfo(addrinfo); + timers_cleanup(&d->timers); free(d); exit(i); } - ok1(io_loop() == d); - ok1(d->state == 3); - ok1(d->timed_out == true); + 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(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(wait(&status)); ok1(WIFEXITED(status)); ok1(WEXITSTATUS(status) < sizeof(d->buf)); /* This one shouldn't time out. */ d->state = 0; - d->timed_out = false; d->timeout_usec = 500000; fflush(stdout); @@ -155,18 +168,20 @@ int main(void) } close(fd); freeaddrinfo(addrinfo); + timers_cleanup(&d->timers); free(d); exit(i); } - ok1(io_loop() == d); + ok1(io_loop(&d->timers, &expired) == d); ok1(d->state == 3); - ok1(d->timed_out == false); + ok1(list_empty(&expired)); ok1(wait(&status)); ok1(WIFEXITED(status)); ok1(WEXITSTATUS(status) >= sizeof(d->buf)); io_close_listener(l); freeaddrinfo(addrinfo); + timers_cleanup(&d->timers); free(d); /* This exits depending on whether all tests passed */