X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Ftest%2Frun-15-timeout.c;h=64741c4f0c869907d3e212a67018732c8f0c3e40;hb=96dcdfbf1a400f7cb43cf3f0761f52fd6de9ff65;hp=6f92ec3a634848c0770fcd21016e56acfb082274;hpb=641b511049e5c03d45ada0c3fd829691b173e5d1;p=ccan diff --git a/ccan/io/test/run-15-timeout.c b/ccan/io/test/run-15-timeout.c index 6f92ec3a..64741c4f 100644 --- a/ccan/io/test/run-15-timeout.c +++ b/ccan/io/test/run-15-timeout.c @@ -3,54 +3,46 @@ #include #include #include +#include #include #include #include -#ifndef PORT #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; - 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_addrel(&d->timers, &d->timer, 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 +82,18 @@ int main(void) struct data *d = malloc(sizeof(*d)); struct addrinfo *addrinfo; struct io_listener *l; + struct timer *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_mono()); + timer_init(&d->timer); 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 +115,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(expired == &d->timer); + ok1(!timers_expire(&d->timers, time_mono())); + ok1(d->state == 1); + + io_close(d->conn); + + /* Finished will be called, d will be returned */ + ok1(io_loop(&d->timers, &expired) == d); + ok1(expired == NULL); + 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 +161,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(expired == NULL); 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 */