summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile6
-rw-r--r--test/poll-cancel.c98
2 files changed, 102 insertions, 2 deletions
diff --git a/test/Makefile b/test/Makefile
index dcf7a56..574f90b 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,11 +1,11 @@
CC = gcc
CFLAGS ?= -g -O2 -Wall -D_GNU_SOURCE -L../src/
-all_targets += io_uring-test io_uring-cp poll
+all_targets += io_uring-test io_uring-cp poll poll-cancel
all: $(all_targets)
-test_srcs := io_uring-test.c io_uring-cp.c poll.c
+test_srcs := io_uring-test.c io_uring-cp.c poll.c poll-cancel.c
test_objs := $(patsubst %.c,%.ol,$(test_srcs))
@@ -15,5 +15,7 @@ io_uring-cp: io_uring-cp.c
$(CC) $(CFLAGS) -o $@ io_uring-cp.c -luring
poll: poll.c
$(CC) $(CFLAGS) -o $@ poll.c -luring
+poll-cancel: poll-cancel.c
+ $(CC) $(CFLAGS) -o $@ poll-cancel.c -luring
clean:
rm -f $(all_targets) $(test_objs)
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;
+}