summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/poll.c86
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;
}
}