uringmachine 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +85 -0
  4. data/TODO.md +5 -0
  5. data/examples/echo_server.rb +18 -40
  6. data/examples/inout.rb +19 -0
  7. data/examples/nc.rb +36 -0
  8. data/ext/um/extconf.rb +6 -15
  9. data/ext/um/um.c +245 -53
  10. data/ext/um/um.h +21 -9
  11. data/ext/um/um_class.c +74 -87
  12. data/ext/um/um_const.c +184 -0
  13. data/ext/um/um_op.c +10 -13
  14. data/ext/um/um_utils.c +48 -3
  15. data/lib/uringmachine/version.rb +1 -1
  16. data/lib/uringmachine.rb +12 -0
  17. data/test/helper.rb +8 -0
  18. data/test/test_um.rb +227 -7
  19. data/vendor/liburing/.github/workflows/build.yml +29 -1
  20. data/vendor/liburing/.gitignore +1 -0
  21. data/vendor/liburing/CHANGELOG +15 -0
  22. data/vendor/liburing/CONTRIBUTING.md +165 -0
  23. data/vendor/liburing/configure +32 -0
  24. data/vendor/liburing/examples/Makefile +8 -1
  25. data/vendor/liburing/examples/kdigest.c +405 -0
  26. data/vendor/liburing/examples/proxy.c +75 -8
  27. data/vendor/liburing/liburing.pc.in +1 -1
  28. data/vendor/liburing/src/Makefile +16 -2
  29. data/vendor/liburing/src/include/liburing/io_uring.h +31 -0
  30. data/vendor/liburing/src/include/liburing/sanitize.h +39 -0
  31. data/vendor/liburing/src/include/liburing.h +31 -4
  32. data/vendor/liburing/src/liburing-ffi.map +5 -0
  33. data/vendor/liburing/src/liburing.map +1 -0
  34. data/vendor/liburing/src/queue.c +3 -0
  35. data/vendor/liburing/src/register.c +36 -0
  36. data/vendor/liburing/src/sanitize.c +176 -0
  37. data/vendor/liburing/src/setup.c +1 -1
  38. data/vendor/liburing/test/35fa71a030ca.c +7 -0
  39. data/vendor/liburing/test/500f9fbadef8.c +2 -0
  40. data/vendor/liburing/test/7ad0e4b2f83c.c +0 -25
  41. data/vendor/liburing/test/917257daa0fe.c +7 -0
  42. data/vendor/liburing/test/Makefile +31 -4
  43. data/vendor/liburing/test/a0908ae19763.c +7 -0
  44. data/vendor/liburing/test/a4c0b3decb33.c +7 -0
  45. data/vendor/liburing/test/accept.c +14 -4
  46. data/vendor/liburing/test/b19062a56726.c +7 -0
  47. data/vendor/liburing/test/bind-listen.c +2 -2
  48. data/vendor/liburing/test/buf-ring-nommap.c +10 -3
  49. data/vendor/liburing/test/buf-ring.c +2 -0
  50. data/vendor/liburing/test/coredump.c +7 -0
  51. data/vendor/liburing/test/cq-overflow.c +13 -1
  52. data/vendor/liburing/test/d4ae271dfaae.c +11 -3
  53. data/vendor/liburing/test/defer-taskrun.c +2 -2
  54. data/vendor/liburing/test/defer-tw-timeout.c +4 -1
  55. data/vendor/liburing/test/defer.c +2 -2
  56. data/vendor/liburing/test/double-poll-crash.c +1 -1
  57. data/vendor/liburing/test/eeed8b54e0df.c +2 -0
  58. data/vendor/liburing/test/eventfd.c +0 -1
  59. data/vendor/liburing/test/exit-no-cleanup.c +11 -0
  60. data/vendor/liburing/test/fadvise.c +9 -26
  61. data/vendor/liburing/test/fdinfo.c +9 -1
  62. data/vendor/liburing/test/file-register.c +14 -2
  63. data/vendor/liburing/test/file-update.c +1 -1
  64. data/vendor/liburing/test/file-verify.c +27 -16
  65. data/vendor/liburing/test/files-exit-hang-timeout.c +1 -2
  66. data/vendor/liburing/test/fixed-buf-iter.c +3 -1
  67. data/vendor/liburing/test/fixed-hugepage.c +12 -1
  68. data/vendor/liburing/test/fsnotify.c +1 -0
  69. data/vendor/liburing/test/futex.c +16 -4
  70. data/vendor/liburing/test/helpers.c +47 -0
  71. data/vendor/liburing/test/helpers.h +6 -0
  72. data/vendor/liburing/test/init-mem.c +5 -3
  73. data/vendor/liburing/test/io-cancel.c +0 -24
  74. data/vendor/liburing/test/io_uring_passthrough.c +2 -0
  75. data/vendor/liburing/test/io_uring_register.c +25 -6
  76. data/vendor/liburing/test/iopoll-leak.c +4 -0
  77. data/vendor/liburing/test/iopoll-overflow.c +1 -1
  78. data/vendor/liburing/test/iopoll.c +3 -3
  79. data/vendor/liburing/test/kallsyms.c +203 -0
  80. data/vendor/liburing/test/link-timeout.c +159 -0
  81. data/vendor/liburing/test/linked-defer-close.c +224 -0
  82. data/vendor/liburing/test/madvise.c +12 -25
  83. data/vendor/liburing/test/min-timeout-wait.c +0 -25
  84. data/vendor/liburing/test/min-timeout.c +0 -25
  85. data/vendor/liburing/test/mkdir.c +6 -0
  86. data/vendor/liburing/test/msg-ring.c +8 -2
  87. data/vendor/liburing/test/napi-test.c +15 -2
  88. data/vendor/liburing/test/no-mmap-inval.c +2 -0
  89. data/vendor/liburing/test/nop.c +44 -0
  90. data/vendor/liburing/test/ooo-file-unreg.c +1 -1
  91. data/vendor/liburing/test/open-close.c +40 -0
  92. data/vendor/liburing/test/openat2.c +37 -14
  93. data/vendor/liburing/test/poll-many.c +13 -7
  94. data/vendor/liburing/test/poll-mshot-update.c +17 -10
  95. data/vendor/liburing/test/poll-v-poll.c +6 -3
  96. data/vendor/liburing/test/pollfree.c +148 -0
  97. data/vendor/liburing/test/read-mshot-empty.c +156 -153
  98. data/vendor/liburing/test/read-mshot.c +276 -27
  99. data/vendor/liburing/test/read-write.c +78 -13
  100. data/vendor/liburing/test/recv-msgall-stream.c +3 -0
  101. data/vendor/liburing/test/recv-msgall.c +5 -0
  102. data/vendor/liburing/test/recvsend_bundle-inc.c +680 -0
  103. data/vendor/liburing/test/recvsend_bundle.c +92 -29
  104. data/vendor/liburing/test/reg-fd-only.c +14 -4
  105. data/vendor/liburing/test/regbuf-clone.c +187 -0
  106. data/vendor/liburing/test/regbuf-merge.c +7 -0
  107. data/vendor/liburing/test/register-restrictions.c +86 -85
  108. data/vendor/liburing/test/rename.c +59 -1
  109. data/vendor/liburing/test/ringbuf-read.c +5 -0
  110. data/vendor/liburing/test/ringbuf-status.c +5 -1
  111. data/vendor/liburing/test/runtests.sh +16 -1
  112. data/vendor/liburing/test/send-zerocopy.c +59 -0
  113. data/vendor/liburing/test/short-read.c +1 -0
  114. data/vendor/liburing/test/socket.c +43 -0
  115. data/vendor/liburing/test/splice.c +3 -1
  116. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  117. data/vendor/liburing/test/sq-poll-share.c +2 -0
  118. data/vendor/liburing/test/sqpoll-disable-exit.c +8 -0
  119. data/vendor/liburing/test/sqpoll-exit-hang.c +1 -25
  120. data/vendor/liburing/test/sqpoll-sleep.c +1 -25
  121. data/vendor/liburing/test/statx.c +89 -0
  122. data/vendor/liburing/test/stdout.c +2 -0
  123. data/vendor/liburing/test/submit-and-wait.c +1 -25
  124. data/vendor/liburing/test/submit-reuse.c +4 -26
  125. data/vendor/liburing/test/symlink.c +12 -1
  126. data/vendor/liburing/test/sync-cancel.c +48 -21
  127. data/vendor/liburing/test/thread-exit.c +5 -0
  128. data/vendor/liburing/test/timeout-new.c +1 -26
  129. data/vendor/liburing/test/timeout.c +12 -26
  130. data/vendor/liburing/test/unlink.c +94 -1
  131. data/vendor/liburing/test/uring_cmd_ublk.c +1252 -0
  132. data/vendor/liburing/test/waitid.c +62 -8
  133. data/vendor/liburing/test/wq-aff.c +35 -0
  134. data/vendor/liburing/test/xfail_prep_link_timeout_out_of_scope.c +46 -0
  135. data/vendor/liburing/test/xfail_register_buffers_out_of_scope.c +51 -0
  136. metadata +17 -4
  137. data/examples/event_loop.rb +0 -69
  138. data/examples/fibers.rb +0 -105
@@ -0,0 +1,148 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test pollfree wakeups
4
+ */
5
+ #include <fcntl.h>
6
+ #include <stdio.h>
7
+ #include <string.h>
8
+ #include <sys/stat.h>
9
+ #include <sys/types.h>
10
+ #include <sys/signalfd.h>
11
+ #include <unistd.h>
12
+ #include <stdlib.h>
13
+
14
+ #include "liburing.h"
15
+ #include "helpers.h"
16
+
17
+ static int no_signalfd;
18
+
19
+ static int child(int flags)
20
+ {
21
+ struct io_uring_sqe *sqe;
22
+ struct io_uring ring;
23
+ struct signalfd_siginfo si;
24
+ static unsigned long index;
25
+ sigset_t mask;
26
+ int ret, fd;
27
+
28
+ ret = io_uring_queue_init(4, &ring, flags);
29
+ if (ret) {
30
+ if (ret == -EINVAL)
31
+ return 0;
32
+ fprintf(stderr, "queue init failed %d\n", ret);
33
+ return ret;
34
+ }
35
+
36
+ sigemptyset(&mask);
37
+ sigaddset(&mask, SIGINT);
38
+
39
+ fd = signalfd(-1, &mask, SFD_NONBLOCK);
40
+ if (fd < 0) {
41
+ no_signalfd = 1;
42
+ perror("signalfd");
43
+ return 1;
44
+ }
45
+
46
+ sqe = io_uring_get_sqe(&ring);
47
+ io_uring_prep_read(sqe, fd, &si, sizeof(si), 0);
48
+ sqe->user_data = 1;
49
+ io_uring_submit(&ring);
50
+
51
+ sqe = io_uring_get_sqe(&ring);
52
+ io_uring_prep_read(sqe, fd, &si, sizeof(si), 0);
53
+ sqe->user_data = 2;
54
+ sqe->flags |= IOSQE_ASYNC;
55
+ io_uring_submit(&ring);
56
+
57
+ sqe = io_uring_get_sqe(&ring);
58
+ io_uring_prep_read(sqe, fd, &si, sizeof(si), 0);
59
+ sqe->user_data = 3;
60
+ io_uring_submit(&ring);
61
+
62
+ if (!(++index & 7))
63
+ usleep(100);
64
+
65
+ return 0;
66
+ }
67
+
68
+ static int run_test(int flags)
69
+ {
70
+ pid_t pid;
71
+ int ret;
72
+
73
+ pid = fork();
74
+ if (pid < 0) {
75
+ perror("fork");
76
+ return 1;
77
+ } else if (!pid) {
78
+ ret = child(flags);
79
+ _exit(ret);
80
+ } else {
81
+ int wstatus;
82
+ pid_t childpid;
83
+
84
+ do {
85
+ childpid = waitpid(pid, &wstatus, 0);
86
+ } while (childpid == (pid_t) -1 && (errno == EINTR));
87
+
88
+ if (errno == ECHILD)
89
+ wstatus = 0;
90
+ return wstatus;
91
+ }
92
+ }
93
+
94
+ static int test(int flags)
95
+ {
96
+ struct timeval start;
97
+ int ret;
98
+
99
+ gettimeofday(&start, NULL);
100
+ do {
101
+ ret = run_test(flags);
102
+ if (ret) {
103
+ fprintf(stderr, "test failed with flags %x\n", flags);
104
+ return 1;
105
+ }
106
+ if (no_signalfd)
107
+ break;
108
+ } while (mtime_since_now(&start) < 2500);
109
+
110
+ return 0;
111
+ }
112
+
113
+ int main(int argc, char *argv[])
114
+ {
115
+ int ret;
116
+
117
+ if (argc > 1)
118
+ return T_EXIT_SKIP;
119
+
120
+ ret = test(0);
121
+ if (ret) {
122
+ fprintf(stderr, "test 0 failed: %d\n", ret);
123
+ return ret;
124
+ }
125
+
126
+ if (no_signalfd)
127
+ return T_EXIT_SKIP;
128
+
129
+ ret = test(IORING_SETUP_SQPOLL);
130
+ if (ret) {
131
+ fprintf(stderr, "test SQPOLL failed: %d\n", ret);
132
+ return ret;
133
+ }
134
+
135
+ ret = test(IORING_SETUP_COOP_TASKRUN);
136
+ if (ret) {
137
+ fprintf(stderr, "test COOP failed: %d\n", ret);
138
+ return ret;
139
+ }
140
+
141
+ ret = test(IORING_SETUP_DEFER_TASKRUN|IORING_SETUP_SINGLE_ISSUER);
142
+ if (ret) {
143
+ fprintf(stderr, "test DEFER failed: %d\n", ret);
144
+ return ret;
145
+ }
146
+
147
+ return T_EXIT_PASS;
148
+ }
@@ -1,153 +1,156 @@
1
- /* SPDX-License-Identifier: MIT */
2
- /*
3
- * Description: test that multishot read correctly keeps reading until all
4
- * data has been emptied. the original implementation failed
5
- * to do so, if the available buffer size was less than what
6
- * was available, hence requiring multiple reads to empty the
7
- * file buffer.
8
- */
9
- #include <stdio.h>
10
- #include <unistd.h>
11
- #include <stdlib.h>
12
- #include <string.h>
13
- #include <assert.h>
14
- #include <pthread.h>
15
- #include <sys/time.h>
16
-
17
- #include "liburing.h"
18
- #include "helpers.h"
19
-
20
- #define BGID 17
21
- #define NR_BUFS 4
22
- #define BR_MASK (NR_BUFS - 1)
23
- #define BUF_SIZE 32
24
-
25
- static int do_write(int fd, void *buf, int buf_size)
26
- {
27
- int ret;
28
-
29
- ret = write(fd, buf, buf_size);
30
- if (ret < 0) {
31
- perror("write");
32
- return 0;
33
- } else if (ret != buf_size) {
34
- fprintf(stderr, "bad write size %d\n", ret);
35
- return 0;
36
- }
37
-
38
- return 1;
39
- }
40
-
41
- static void *thread_fn(void *data)
42
- {
43
- char w1[BUF_SIZE], w2[BUF_SIZE];
44
- int *fds = data;
45
-
46
- memset(w1, 0x11, BUF_SIZE);
47
- memset(w2, 0x22, BUF_SIZE);
48
-
49
- if (!do_write(fds[1], w1, BUF_SIZE))
50
- return NULL;
51
- if (!do_write(fds[1], w2, BUF_SIZE))
52
- return NULL;
53
-
54
- usleep(100000);
55
-
56
- if (!do_write(fds[1], w1, BUF_SIZE))
57
- return NULL;
58
- if (!do_write(fds[1], w2, BUF_SIZE))
59
- return NULL;
60
-
61
- return NULL;
62
- }
63
-
64
- int main(int argc, char *argv[])
65
- {
66
- struct io_uring_buf_ring *br;
67
- struct io_uring_sqe *sqe;
68
- struct io_uring_cqe *cqe;
69
- struct io_uring ring;
70
- pthread_t thread;
71
- int i, ret, fds[2];
72
- void *buf, *tret;
73
-
74
- if (argc > 1)
75
- return T_EXIT_SKIP;
76
-
77
- if (pipe(fds) < 0) {
78
- perror("pipe");
79
- return T_EXIT_FAIL;
80
- }
81
-
82
- ret = io_uring_queue_init(8, &ring, 0);
83
- if (ret) {
84
- fprintf(stderr, "queue_init: %d\n", ret);
85
- return T_EXIT_FAIL;
86
- }
87
-
88
- br = io_uring_setup_buf_ring(&ring, NR_BUFS, BGID, 0, &ret);
89
- if (!br) {
90
- if (ret == -EINVAL)
91
- return T_EXIT_SKIP;
92
- fprintf(stderr, "failed buffer ring %d\n", ret);
93
- return T_EXIT_FAIL;
94
- }
95
-
96
- buf = malloc(NR_BUFS * BUF_SIZE);
97
- for (i = 0; i < NR_BUFS; i++) {
98
- void *this_buf = buf + i * BUF_SIZE;
99
-
100
- io_uring_buf_ring_add(br, this_buf, BUF_SIZE, i, BR_MASK, i);
101
- }
102
- io_uring_buf_ring_advance(br, NR_BUFS);
103
-
104
- sqe = io_uring_get_sqe(&ring);
105
- io_uring_prep_read_multishot(sqe, fds[0], 0, 0, BGID);
106
-
107
- ret = io_uring_submit(&ring);
108
- if (ret != 1) {
109
- fprintf(stderr, "bad submit %d\n", ret);
110
- return T_EXIT_FAIL;
111
- }
112
-
113
- /*
114
- * read multishot not available would be ready as a cqe when
115
- * submission returns, check and skip if not.
116
- */
117
- ret = io_uring_peek_cqe(&ring, &cqe);
118
- if (!ret) {
119
- if (cqe->res == -EINVAL || cqe->res == -EBADF)
120
- return T_EXIT_SKIP;
121
- }
122
-
123
- pthread_create(&thread, NULL, thread_fn, fds);
124
-
125
- for (i = 0; i < 4; i++) {
126
- int buf_index;
127
-
128
- ret = io_uring_wait_cqe(&ring, &cqe);
129
- if (ret) {
130
- fprintf(stderr, "wait %d\n", ret);
131
- break;
132
- }
133
-
134
- if (cqe->res != BUF_SIZE) {
135
- fprintf(stderr, "size %d\n", cqe->res);
136
- return T_EXIT_FAIL;
137
- }
138
- if (!(cqe->flags & IORING_CQE_F_BUFFER)) {
139
- fprintf(stderr, "buffer not set\n");
140
- return T_EXIT_FAIL;
141
- }
142
- if (!(cqe->flags & IORING_CQE_F_MORE)) {
143
- fprintf(stderr, "more not set\n");
144
- return T_EXIT_FAIL;
145
- }
146
- buf_index = cqe->flags >> 16;
147
- assert(buf_index >= 0 && buf_index <= NR_BUFS);
148
- io_uring_cqe_seen(&ring, cqe);
149
- }
150
-
151
- pthread_join(thread, &tret);
152
- return T_EXIT_PASS;
153
- }
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test that multishot read correctly keeps reading until all
4
+ * data has been emptied. the original implementation failed
5
+ * to do so, if the available buffer size was less than what
6
+ * was available, hence requiring multiple reads to empty the
7
+ * file buffer.
8
+ */
9
+ #include <stdio.h>
10
+ #include <unistd.h>
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+ #include <assert.h>
14
+ #include <pthread.h>
15
+ #include <sys/time.h>
16
+
17
+ #include "liburing.h"
18
+ #include "helpers.h"
19
+
20
+ #define BGID 17
21
+ #define NR_BUFS 4
22
+ #define BR_MASK (NR_BUFS - 1)
23
+ #define BUF_SIZE 32
24
+
25
+ static int do_write(int fd, void *buf, int buf_size)
26
+ {
27
+ int ret;
28
+
29
+ ret = write(fd, buf, buf_size);
30
+ if (ret < 0) {
31
+ perror("write");
32
+ return 0;
33
+ } else if (ret != buf_size) {
34
+ fprintf(stderr, "bad write size %d\n", ret);
35
+ return 0;
36
+ }
37
+
38
+ return 1;
39
+ }
40
+
41
+ static void *thread_fn(void *data)
42
+ {
43
+ char w1[BUF_SIZE], w2[BUF_SIZE];
44
+ int *fds = data;
45
+
46
+ memset(w1, 0x11, BUF_SIZE);
47
+ memset(w2, 0x22, BUF_SIZE);
48
+
49
+ if (!do_write(fds[1], w1, BUF_SIZE))
50
+ return NULL;
51
+ if (!do_write(fds[1], w2, BUF_SIZE))
52
+ return NULL;
53
+
54
+ usleep(100000);
55
+
56
+ if (!do_write(fds[1], w1, BUF_SIZE))
57
+ return NULL;
58
+ if (!do_write(fds[1], w2, BUF_SIZE))
59
+ return NULL;
60
+
61
+ return NULL;
62
+ }
63
+
64
+ int main(int argc, char *argv[])
65
+ {
66
+ struct io_uring_buf_ring *br;
67
+ struct io_uring_sqe *sqe;
68
+ struct io_uring_cqe *cqe;
69
+ struct io_uring ring;
70
+ pthread_t thread;
71
+ int i, ret, fds[2];
72
+ void *buf, *tret;
73
+
74
+ if (argc > 1)
75
+ return T_EXIT_SKIP;
76
+
77
+ if (pipe(fds) < 0) {
78
+ perror("pipe");
79
+ return T_EXIT_FAIL;
80
+ }
81
+
82
+ ret = io_uring_queue_init(8, &ring, 0);
83
+ if (ret) {
84
+ fprintf(stderr, "queue_init: %d\n", ret);
85
+ return T_EXIT_FAIL;
86
+ }
87
+
88
+ br = io_uring_setup_buf_ring(&ring, NR_BUFS, BGID, 0, &ret);
89
+ if (!br) {
90
+ if (ret == -EINVAL)
91
+ return T_EXIT_SKIP;
92
+ fprintf(stderr, "failed buffer ring %d\n", ret);
93
+ return T_EXIT_FAIL;
94
+ }
95
+
96
+ buf = malloc(NR_BUFS * BUF_SIZE);
97
+ for (i = 0; i < NR_BUFS; i++) {
98
+ void *this_buf = buf + i * BUF_SIZE;
99
+
100
+ io_uring_buf_ring_add(br, this_buf, BUF_SIZE, i, BR_MASK, i);
101
+ }
102
+ io_uring_buf_ring_advance(br, NR_BUFS);
103
+
104
+ sqe = io_uring_get_sqe(&ring);
105
+ io_uring_prep_read_multishot(sqe, fds[0], 0, 0, BGID);
106
+
107
+ ret = io_uring_submit(&ring);
108
+ if (ret != 1) {
109
+ fprintf(stderr, "bad submit %d\n", ret);
110
+ return T_EXIT_FAIL;
111
+ }
112
+
113
+ /*
114
+ * read multishot not available would be ready as a cqe when
115
+ * submission returns, check and skip if not.
116
+ */
117
+ ret = io_uring_peek_cqe(&ring, &cqe);
118
+ if (!ret) {
119
+ if (cqe->res == -EINVAL || cqe->res == -EBADF) {
120
+ free(buf);
121
+ return T_EXIT_SKIP;
122
+ }
123
+ }
124
+
125
+ pthread_create(&thread, NULL, thread_fn, fds);
126
+
127
+ for (i = 0; i < 4; i++) {
128
+ int buf_index;
129
+
130
+ ret = io_uring_wait_cqe(&ring, &cqe);
131
+ if (ret) {
132
+ fprintf(stderr, "wait %d\n", ret);
133
+ break;
134
+ }
135
+
136
+ if (cqe->res != BUF_SIZE) {
137
+ fprintf(stderr, "size %d\n", cqe->res);
138
+ return T_EXIT_FAIL;
139
+ }
140
+ if (!(cqe->flags & IORING_CQE_F_BUFFER)) {
141
+ fprintf(stderr, "buffer not set\n");
142
+ return T_EXIT_FAIL;
143
+ }
144
+ if (!(cqe->flags & IORING_CQE_F_MORE)) {
145
+ fprintf(stderr, "more not set\n");
146
+ return T_EXIT_FAIL;
147
+ }
148
+ buf_index = cqe->flags >> 16;
149
+ assert(buf_index >= 0 && buf_index <= NR_BUFS);
150
+ io_uring_cqe_seen(&ring, cqe);
151
+ }
152
+
153
+ pthread_join(thread, &tret);
154
+ free(buf);
155
+ return T_EXIT_PASS;
156
+ }