X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Ftest%2Frun-08-hangup-on-idle.c;h=52309b4bf018045830f6a5a7f02ef6abf0921151;hb=e92e2f65a9ae729a0c9805427da737ad936abddb;hp=7463dd98c83e592525fc09b0a30ea250681fef20;hpb=0f16a4197c94bfa84dad56d0cb9a9c20438d0a45;p=ccan diff --git a/ccan/io/test/run-08-hangup-on-idle.c b/ccan/io/test/run-08-hangup-on-idle.c index 7463dd98..52309b4b 100644 --- a/ccan/io/test/run-08-hangup-on-idle.c +++ b/ccan/io/test/run-08-hangup-on-idle.c @@ -8,33 +8,49 @@ static int fds2[2]; -static struct io_plan timeout_wakeup(struct io_conn *conn, char *buf) +static struct io_plan *read_in(struct io_conn *conn, char *buf) { - /* This kills the dummy connection. */ - close(fds2[1]); - return io_read(buf, 16, io_close, NULL); + return io_read(conn, buf, 16, io_close_cb, NULL); +} + +static struct io_plan *setup_waiter(struct io_conn *conn, char *buf) +{ + return io_wait(conn, buf, read_in, buf); +} + +static struct io_plan *wake_and_close(struct io_conn *conn, char *buf) +{ + io_wake(buf); + return io_close(conn); +} + +static struct io_plan *setup_waker(struct io_conn *conn, char *buf) +{ + return io_read(conn, buf, 1, wake_and_close, buf); } int main(void) { int fds[2]; - struct io_conn *conn; char buf[16]; plan_tests(4); ok1(pipe(fds) == 0); - /* Write then close. */ - io_new_conn(fds[1], io_write("hello there world", 16, io_close, NULL)); - conn = io_new_conn(fds[0], io_idle()); - - /* To avoid assert(num_waiting) */ + io_new_conn(NULL, fds[0], setup_waiter, buf); ok1(pipe(fds2) == 0); - io_new_conn(fds2[0], io_read(buf, 16, io_close, NULL)); + io_new_conn(NULL, fds2[0], setup_waker, buf); + + if (fork() == 0) { + write(fds[1], "hello there world", 16); + close(fds[1]); - /* After half a second, it will read. */ - io_timeout(conn, time_from_msec(500), timeout_wakeup, buf); + /* Now wake it. */ + sleep(1); + write(fds2[1], "", 1); + exit(0); + } ok1(io_loop() == NULL); ok1(memcmp(buf, "hello there world", 16) == 0);