From d58ea1a0ea2a4755871cab4d30147b442d3f6735 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 18 Jan 2019 08:29:44 -0700 Subject: test/poll-cancel: improve test case - Add a timeout, if we don't finish in one second we are definitely hung because the poll remove command didn't work. - Don't assume completion ordering Signed-off-by: Jens Axboe --- test/poll-cancel.c | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/test/poll-cancel.c b/test/poll-cancel.c index 3c62f18..722e7ff 100644 --- a/test/poll-cancel.c +++ b/test/poll-cancel.c @@ -7,18 +7,32 @@ #include #include #include +#include #include #include +#include #include "../src/liburing.h" +struct poll_data { + unsigned is_poll; + unsigned is_cancel; +}; + +static void sig_alrm(int sig) +{ + printf("Timed out!\n"); + exit(1); +} + int main(int argc, char *argv[]) { struct io_uring ring; int pipe1[2]; struct io_uring_cqe *cqe; struct io_uring_sqe *sqe; - void *addr; + struct poll_data *pd, pds[2]; + struct sigaction act; int ret; if (pipe(pipe1) != 0) { @@ -32,6 +46,12 @@ int main(int argc, char *argv[]) return 1; } + memset(&act, 0, sizeof(act)); + act.sa_handler = sig_alrm; + act.sa_flags = SA_RESTART; + sigaction(SIGALRM, &act, NULL); + alarm(1); + sqe = io_uring_get_sqe(&ring); if (!sqe) { printf("child: get sqe failed\n"); @@ -39,8 +59,10 @@ int main(int argc, char *argv[]) } io_uring_prep_poll_add(sqe, pipe1[0], POLLIN); - io_uring_sqe_set_data(sqe, sqe); - addr = sqe; + + pds[0].is_poll = 1; + pds[0].is_cancel = 0; + io_uring_sqe_set_data(sqe, &pds[0]); ret = io_uring_submit(&ring); if (ret <= 0) { @@ -54,8 +76,10 @@ int main(int argc, char *argv[]) return 1; } - io_uring_prep_poll_remove(sqe, addr); - io_uring_sqe_set_data(sqe, sqe); + pds[1].is_poll = 0; + pds[1].is_cancel = 0; + io_uring_prep_poll_remove(sqe, &pds[0]); + io_uring_sqe_set_data(sqe, &pds[1]); ret = io_uring_submit(&ring); if (ret <= 0) { @@ -69,8 +93,10 @@ int main(int argc, char *argv[]) return 1; } - if (cqe->user_data != (unsigned long) addr) { - printf("first complete not poll\n"); + pd = (struct poll_data *) (uintptr_t) cqe->user_data; + if (cqe->res != 0) { + printf("sqe (add=%d/remove=%d) failed with %ld\n", pd->is_poll, + pd->is_cancel, (long) cqe->res); return 1; } @@ -79,8 +105,11 @@ int main(int argc, char *argv[]) printf("parent: get failed\n"); return 1; } - if (cqe->user_data != (unsigned long) sqe) { - printf("second not cancel\n"); + + pd = (struct poll_data *) (uintptr_t) cqe->user_data; + if (cqe->res != 0) { + printf("sqe (add=%d/remove=%d) failed with %ld\n", pd->is_poll, + pd->is_cancel, (long) cqe->res); return 1; } -- cgit