summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-01-18 15:10:32 -0700
committerJens Axboe <axboe@kernel.dk>2019-01-18 15:14:43 -0700
commita2fc9f13b52978ee0e5f16080fd0f42899aa15b4 (patch)
treed9db70a5e0e818c5d36c09bf3a5e2f1ad87cd60b /test
parentd58ea1a0ea2a4755871cab4d30147b442d3f6735 (diff)
test/poll: simply test case
Just setup one ring in the child process, and poll for when the read side of the pipe is readable. From the parent, write something to the pipe. If nothing happens within 1 second, fail the test. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'test')
-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;
}
}