X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Ftest%2Frun-08-hangup-on-idle.c;h=eb3dab3d5fcf29188efb3d8e1351383de0b58110;hb=94dd4c2bddd0dc080ad5b85465fa3f45f486967a;hp=b3840433410b7bfda4068293728c8050b2483856;hpb=13b38a7282c6043d6abe310e5a16d6610ed7a1c1;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 b3840433..eb3dab3d 100644 --- a/ccan/io/test/run-08-hangup-on-idle.c +++ b/ccan/io/test/run-08-hangup-on-idle.c @@ -8,36 +8,51 @@ 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_cb, 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_cb, 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_cb, 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(io_loop(NULL, NULL) == NULL); ok1(memcmp(buf, "hello there world", 16) == 0); /* This exits depending on whether all tests passed */