summaryrefslogtreecommitdiff
path: root/test/poll-cancel.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-01-17 13:05:52 -0700
committerJens Axboe <axboe@kernel.dk>2019-01-17 13:05:52 -0700
commit79a7d3a3f6710dc257dfb2095d5d91d73d0b93bf (patch)
treece62b4e8eeea783ab1527c07d79b1dbcaa0dd140 /test/poll-cancel.c
parentce899b79f93d077ddce837656f59e79b2296fb71 (diff)
Add IORING_OP_POLL_CANCEL test
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'test/poll-cancel.c')
-rw-r--r--test/poll-cancel.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/test/poll-cancel.c b/test/poll-cancel.c
new file mode 100644
index 0000000..ec12353
--- /dev/null
+++ b/test/poll-cancel.c
@@ -0,0 +1,98 @@
+/*
+ * Description: test io_uring poll cancel handling
+ *
+ */
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/poll.h>
+#include <sys/wait.h>
+
+#include "../src/liburing.h"
+
+int main(int argc, char *argv[])
+{
+ struct io_uring ring;
+ int pipe1[2];
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ unsigned long addr;
+ int ret;
+
+ if (pipe(pipe1) != 0) {
+ printf("pipe failed\n");
+ return 1;
+ }
+
+ ret = io_uring_queue_init(2, &ring, 0);
+ if (ret) {
+ printf("child: ring setup failed\n");
+ return 1;
+ }
+
+ sqe = io_uring_get_sqe(&ring);
+ if (!sqe) {
+ printf("child: get sqe failed\n");
+ return 1;
+ }
+ sqe->opcode = IORING_OP_POLL;
+ sqe->flags = 0;
+ sqe->ioprio = 0;
+ sqe->fd = pipe1[0];
+ sqe->addr = POLLIN;
+ sqe->off = 0;
+ sqe->len = 0;
+ sqe->buf_index = 0;
+ sqe->user_data = addr = (unsigned long) &sqe;
+
+ ret = io_uring_submit(&ring);
+ if (ret <= 0) {
+ printf("child: sqe submit failed\n");
+ return 1;
+ }
+
+ sqe = io_uring_get_sqe(&ring);
+ if (!sqe) {
+ printf("child: get sqe failed\n");
+ return 1;
+ }
+ sqe->opcode = IORING_OP_POLL_CANCEL;
+ sqe->flags = 0;
+ sqe->ioprio = 0;
+ sqe->fd = 0;
+ sqe->addr = addr;
+ sqe->off = 0;
+ sqe->len = 0;
+ sqe->buf_index = 0;
+ sqe->user_data = (unsigned long) &sqe;
+
+ ret = io_uring_submit(&ring);
+ if (ret <= 0) {
+ printf("child: sqe submit failed\n");
+ return 1;
+ }
+
+ ret = io_uring_wait_completion(&ring, &cqe);
+ if (ret < 0) {
+ printf("child: get cqe failed\n");
+ return 1;
+ }
+
+ if (cqe->user_data != addr) {
+ printf("first complete not poll\n");
+ return 1;
+ }
+
+ ret = io_uring_wait_completion(&ring, &cqe);
+ if (ret < 0) {
+ printf("parent: get failed\n");
+ return 1;
+ }
+ if (cqe->user_data != (unsigned long) &sqe) {
+ printf("second not cancel\n");
+ return 1;
+ }
+
+ return 0;
+}