diff options
-rw-r--r-- | test/poll-cancel.c | 47 |
1 files 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 <unistd.h> #include <stdlib.h> #include <string.h> +#include <inttypes.h> #include <sys/poll.h> #include <sys/wait.h> +#include <sys/signal.h> #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; } |