X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Ftest%2Frun-15-timeout.c;h=5709ddaa8a25416d6bb56c2a7d21ce81688e0e52;hp=6f92ec3a634848c0770fcd21016e56acfb082274;hb=36bfb66bdf74f4f3382cd00dae7b899e80e2cf1a;hpb=3a7b8a8a8081ebbb6457527de376dec6264bc381 diff --git a/ccan/io/test/run-15-timeout.c b/ccan/io/test/run-15-timeout.c index 6f92ec3a..5709ddaa 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,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_now()); + 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 +123,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_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(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 +169,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 */