diff options
-rw-r--r-- | test/poll.c | 86 |
1 files changed, 35 insertions, 51 deletions
diff --git a/test/poll.c b/test/poll.c index c3800d6..ee1f8ec 100644 --- a/test/poll.c +++ b/test/poll.c @@ -1,28 +1,34 @@ /* * Description: test io_uring poll handling * - * Based on 22.t from libaio */ #include <errno.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <sys/poll.h> #include <sys/wait.h> #include "../src/liburing.h" +static void sig_alrm(int sig) +{ + printf("Timed out!\n"); + exit(1); +} + int main(int argc, char *argv[]) { pid_t parent = getpid(), p; - int pipe1[2], pipe2[2]; - struct io_uring cring, pring; struct io_uring_cqe *cqe; struct io_uring_sqe *sqe; + struct io_uring ring; + int pipe1[2]; int ret; - if (pipe(pipe1) != 0 || pipe(pipe2) != 0) { + if (pipe(pipe1) != 0) { printf("pipe failed\n"); return 1; } @@ -32,25 +38,31 @@ int main(int argc, char *argv[]) case -1: printf("fork failed\n"); exit(2); - case 0: - close(pipe1[1]); - close(pipe2[0]); + case 0: { + struct sigaction act; - ret = io_uring_queue_init(1, &cring, 0); + ret = io_uring_queue_init(1, &ring, 0); if (ret) { printf("child: ring setup failed\n"); return 1; } - sqe = io_uring_get_sqe(&cring); + 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"); return 1; } io_uring_prep_poll_add(sqe, pipe1[0], POLLIN); + io_uring_sqe_set_data(sqe, sqe); - ret = io_uring_submit(&cring); + ret = io_uring_submit(&ring); if (ret <= 0) { printf("child: sqe submit failed\n"); return 1; @@ -61,61 +73,33 @@ int main(int argc, char *argv[]) printf("parent died\n"); exit(2); } - ret = io_uring_wait_completion(&cring, &cqe); + ret = io_uring_wait_completion(&ring, &cqe); } while (ret != 0); if (ret < 0) { printf("child: completion get failed\n"); return 1; } - - do { - errno = 0; - ret = write(pipe2[1], "foo", 3); - } while (ret == -1 && errno == EINTR); - - exit(0); - default: - close(pipe1[0]); - close(pipe2[1]); - - ret = io_uring_queue_init(1, &pring, 0); - if (ret) { - printf("parent: ring setup failed\n"); + if (cqe->user_data != (unsigned long) sqe) { + printf("child: cqe doesn't match sqe\n"); return 1; } - - sqe = io_uring_get_sqe(&pring); - if (!sqe) { - printf("parent: get sqe failed\n"); + if ((cqe->res & POLLIN) != POLLIN) { + printf("child: bad return value %ld\n", (long) cqe->res); return 1; } - - io_uring_prep_poll_add(sqe, pipe2[0], POLLIN); - io_uring_sqe_set_data(sqe, sqe); - - ret = io_uring_submit(&pring); - if (ret <= 0) { - printf("parent: sqe submit failed\n"); - return 1; + exit(0); } + default: + do { + errno = 0; + ret = write(pipe1[1], "foo", 3); + } while (ret == -1 && errno == EINTR); - kill(p, SIGUSR1); - - ret = io_uring_wait_completion(&pring, &cqe); - if (ret < 0) { - printf("parent: cqe get failed\n"); - return 1; - } - if (cqe->user_data != (unsigned long) sqe) { - printf("parent: cqe wrong fd\n"); + if (ret != 3) { + printf("parent: bad write return %d\n", ret); return 1; } - if ((cqe->res & POLLIN) != POLLIN) { - printf("parent: cqe did not report readable fd\n"); - return 1; - } - return 0; } } |