uringmachine 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
@@ -0,0 +1,117 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test io_uring symlinkat handling
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 <unistd.h>
11
+
12
+ #include "liburing.h"
13
+
14
+
15
+ static int do_symlinkat(struct io_uring *ring, const char *oldname, const char *newname)
16
+ {
17
+ int ret;
18
+ struct io_uring_sqe *sqe;
19
+ struct io_uring_cqe *cqe;
20
+
21
+ sqe = io_uring_get_sqe(ring);
22
+ if (!sqe) {
23
+ fprintf(stderr, "sqe get failed\n");
24
+ goto err;
25
+ }
26
+ io_uring_prep_symlinkat(sqe, oldname, AT_FDCWD, newname);
27
+
28
+ ret = io_uring_submit(ring);
29
+ if (ret != 1) {
30
+ fprintf(stderr, "submit failed: %d\n", ret);
31
+ goto err;
32
+ }
33
+
34
+ ret = io_uring_wait_cqes(ring, &cqe, 1, 0, 0);
35
+ if (ret) {
36
+ fprintf(stderr, "wait_cqe failed: %d\n", ret);
37
+ goto err;
38
+ }
39
+ ret = cqe->res;
40
+ io_uring_cqe_seen(ring, cqe);
41
+ return ret;
42
+ err:
43
+ return 1;
44
+ }
45
+
46
+ static int test_link_contents(const char* linkname,
47
+ const char *expected_contents)
48
+ {
49
+ char buf[128];
50
+ int ret = readlink(linkname, buf, 127);
51
+ if (ret < 0) {
52
+ perror("readlink");
53
+ return ret;
54
+ }
55
+ buf[ret] = 0;
56
+ if (strncmp(buf, expected_contents, 128)) {
57
+ fprintf(stderr, "link contents differs from expected: '%s' vs '%s'",
58
+ buf, expected_contents);
59
+ return -1;
60
+ }
61
+ return 0;
62
+ }
63
+
64
+ int main(int argc, char *argv[])
65
+ {
66
+ static const char target[] = "io_uring-symlinkat-test-target";
67
+ static const char linkname[] = "io_uring-symlinkat-test-link";
68
+ int ret;
69
+ struct io_uring ring;
70
+
71
+ if (argc > 1)
72
+ return 0;
73
+
74
+ ret = io_uring_queue_init(8, &ring, 0);
75
+ if (ret) {
76
+ fprintf(stderr, "queue init failed: %d\n", ret);
77
+ return ret;
78
+ }
79
+
80
+ ret = do_symlinkat(&ring, target, linkname);
81
+ if (ret < 0) {
82
+ if (ret == -EBADF || ret == -EINVAL) {
83
+ fprintf(stdout, "symlinkat not supported, skipping\n");
84
+ goto out;
85
+ }
86
+ fprintf(stderr, "symlinkat: %s\n", strerror(-ret));
87
+ goto err;
88
+ } else if (ret) {
89
+ goto err;
90
+ }
91
+
92
+ ret = test_link_contents(linkname, target);
93
+ if (ret < 0)
94
+ goto err1;
95
+
96
+ ret = do_symlinkat(&ring, target, linkname);
97
+ if (ret != -EEXIST) {
98
+ fprintf(stderr, "test_symlinkat linkname already exists failed: %d\n", ret);
99
+ goto err1;
100
+ }
101
+
102
+ ret = do_symlinkat(&ring, target, "surely/this/does/not/exist");
103
+ if (ret != -ENOENT) {
104
+ fprintf(stderr, "test_symlinkat no parent failed: %d\n", ret);
105
+ goto err1;
106
+ }
107
+
108
+ out:
109
+ unlinkat(AT_FDCWD, linkname, 0);
110
+ io_uring_queue_exit(&ring);
111
+ return 0;
112
+ err1:
113
+ unlinkat(AT_FDCWD, linkname, 0);
114
+ err:
115
+ io_uring_queue_exit(&ring);
116
+ return 1;
117
+ }
@@ -0,0 +1,235 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test io_uring_register_sync_cancel()
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "liburing.h"
14
+ #include "helpers.h"
15
+
16
+ static int no_sync_cancel;
17
+
18
+ static int test_sync_cancel_timeout(struct io_uring *ring, int async)
19
+ {
20
+ struct io_uring_sync_cancel_reg reg = { };
21
+ struct io_uring_sqe *sqe;
22
+ struct io_uring_cqe *cqe;
23
+ int ret, fds[2], to_prep;
24
+ char buf[32];
25
+
26
+ if (pipe(fds) < 0) {
27
+ perror("pipe");
28
+ return 1;
29
+ }
30
+
31
+ to_prep = 1;
32
+ sqe = io_uring_get_sqe(ring);
33
+ io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0);
34
+ sqe->user_data = 0x89;
35
+ if (async)
36
+ sqe->flags |= IOSQE_ASYNC;
37
+
38
+ ret = io_uring_submit(ring);
39
+ if (ret != to_prep) {
40
+ fprintf(stderr, "submit=%d\n", ret);
41
+ return 1;
42
+ }
43
+
44
+ usleep(10000);
45
+
46
+ reg.addr = 0x89;
47
+ reg.timeout.tv_nsec = 1;
48
+ ret = io_uring_register_sync_cancel(ring, &reg);
49
+ if (async) {
50
+ /* we expect -ETIME here, but can race and get 0 */
51
+ if (ret != -ETIME && ret != 0) {
52
+ fprintf(stderr, "sync_cancel=%d\n", ret);
53
+ return 1;
54
+ }
55
+ } else {
56
+ if (ret < 0) {
57
+ fprintf(stderr, "sync_cancel=%d\n", ret);
58
+ return 1;
59
+ }
60
+ }
61
+
62
+ /*
63
+ * we could _almost_ use peek_cqe() here, but there is still
64
+ * a small gap where io-wq is done with the request and on
65
+ * its way to posting a completion, but hasn't done it just
66
+ * yet. the request is canceled and won't be doing any IO
67
+ * to buffers etc, but the cqe may not have quite arrived yet.
68
+ */
69
+ ret = io_uring_wait_cqe(ring, &cqe);
70
+ if (ret) {
71
+ fprintf(stderr, "peek=%d\n", ret);
72
+ return 1;
73
+ }
74
+ if (cqe->res >= 0) {
75
+ fprintf(stderr, "cqe->res=%d\n", cqe->res);
76
+ return 1;
77
+ }
78
+ io_uring_cqe_seen(ring, cqe);
79
+ return 0;
80
+ }
81
+
82
+ static int test_sync_cancel(struct io_uring *ring, int async, int nr_all,
83
+ int use_fd)
84
+ {
85
+ struct io_uring_sync_cancel_reg reg = { };
86
+ struct io_uring_sqe *sqe;
87
+ struct io_uring_cqe *cqe;
88
+ int ret, fds[2], to_prep, i;
89
+ char buf[32];
90
+
91
+ if (pipe(fds) < 0) {
92
+ perror("pipe");
93
+ return 1;
94
+ }
95
+
96
+ to_prep = 1;
97
+ if (nr_all)
98
+ to_prep = 4;
99
+ for (i = 0; i < to_prep; i++) {
100
+ sqe = io_uring_get_sqe(ring);
101
+ io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0);
102
+ sqe->user_data = 0x89;
103
+ if (async)
104
+ sqe->flags |= IOSQE_ASYNC;
105
+ }
106
+
107
+ ret = io_uring_submit(ring);
108
+ if (ret != to_prep) {
109
+ fprintf(stderr, "submit=%d\n", ret);
110
+ return 1;
111
+ }
112
+
113
+ usleep(10000);
114
+
115
+ if (!use_fd)
116
+ reg.addr = 0x89;
117
+ else
118
+ reg.fd = fds[0];
119
+ reg.timeout.tv_sec = 200;
120
+ if (nr_all)
121
+ reg.flags |= IORING_ASYNC_CANCEL_ALL;
122
+ if (use_fd)
123
+ reg.flags |= IORING_ASYNC_CANCEL_FD;
124
+ ret = io_uring_register_sync_cancel(ring, &reg);
125
+ if (ret < 0) {
126
+ if (ret == -EINVAL && !no_sync_cancel) {
127
+ no_sync_cancel = 1;
128
+ return 0;
129
+ }
130
+ fprintf(stderr, "sync_cancel=%d\n", ret);
131
+ return 1;
132
+ }
133
+
134
+ for (i = 0; i < to_prep; i++) {
135
+ /*
136
+ * we could _almost_ use peek_cqe() here, but there is still
137
+ * a small gap where io-wq is done with the request and on
138
+ * its way to posting a completion, but hasn't done it just
139
+ * yet. the request is canceled and won't be doing any IO
140
+ * to buffers etc, but the cqe may not have quite arrived yet.
141
+ */
142
+ ret = io_uring_wait_cqe(ring, &cqe);
143
+ if (ret) {
144
+ fprintf(stderr, "peek=%d\n", ret);
145
+ return 1;
146
+ }
147
+ if (cqe->res >= 0) {
148
+ fprintf(stderr, "cqe->res=%d\n", cqe->res);
149
+ return 1;
150
+ }
151
+ io_uring_cqe_seen(ring, cqe);
152
+ }
153
+
154
+ return 0;
155
+ }
156
+
157
+ int main(int argc, char *argv[])
158
+ {
159
+ struct io_uring ring;
160
+ int ret;
161
+
162
+ if (argc > 1)
163
+ return T_EXIT_SKIP;
164
+
165
+ ret = t_create_ring(7, &ring, 0);
166
+ if (ret == T_SETUP_SKIP)
167
+ return T_EXIT_SKIP;
168
+ else if (ret != T_SETUP_OK)
169
+ return ret;
170
+
171
+ ret = test_sync_cancel(&ring, 0, 0, 0);
172
+ if (ret) {
173
+ fprintf(stderr, "test_sync_cancel 0 0 0 failed\n");
174
+ return T_EXIT_FAIL;
175
+ }
176
+ if (no_sync_cancel)
177
+ return T_EXIT_SKIP;
178
+
179
+ ret = test_sync_cancel(&ring, 1, 0, 0);
180
+ if (ret) {
181
+ fprintf(stderr, "test_sync_cancel 1 0 0 failed\n");
182
+ return T_EXIT_FAIL;
183
+ }
184
+
185
+ ret = test_sync_cancel(&ring, 0, 1, 0);
186
+ if (ret) {
187
+ fprintf(stderr, "test_sync_cancel 0 1 0 failed\n");
188
+ return T_EXIT_FAIL;
189
+ }
190
+
191
+ ret = test_sync_cancel(&ring, 1, 1, 0);
192
+ if (ret) {
193
+ fprintf(stderr, "test_sync_cancel 1 1 0 failed\n");
194
+ return T_EXIT_FAIL;
195
+ }
196
+
197
+ ret = test_sync_cancel(&ring, 0, 0, 1);
198
+ if (ret) {
199
+ fprintf(stderr, "test_sync_cancel 0 0 1 failed\n");
200
+ return T_EXIT_FAIL;
201
+ }
202
+
203
+ ret = test_sync_cancel(&ring, 1, 0, 1);
204
+ if (ret) {
205
+ fprintf(stderr, "test_sync_cancel 1 0 1 failed\n");
206
+ return T_EXIT_FAIL;
207
+ }
208
+
209
+ ret = test_sync_cancel(&ring, 0, 1, 1);
210
+ if (ret) {
211
+ fprintf(stderr, "test_sync_cancel 0 1 1 failed\n");
212
+ return T_EXIT_FAIL;
213
+ }
214
+
215
+ ret = test_sync_cancel(&ring, 1, 1, 1);
216
+ if (ret) {
217
+ fprintf(stderr, "test_sync_cancel 1 1 1 failed\n");
218
+ return T_EXIT_FAIL;
219
+ }
220
+
221
+ ret = test_sync_cancel_timeout(&ring, 0);
222
+ if (ret) {
223
+ fprintf(stderr, "test_sync_cancel_timeout 0\n");
224
+ return T_EXIT_FAIL;
225
+ }
226
+
227
+ /* must be last, leaves request */
228
+ ret = test_sync_cancel_timeout(&ring, 1);
229
+ if (ret) {
230
+ fprintf(stderr, "test_sync_cancel_timeout 1\n");
231
+ return T_EXIT_FAIL;
232
+ }
233
+
234
+ return T_EXIT_PASS;
235
+ }
@@ -0,0 +1,58 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ #include <stdint.h>
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+ #include <sys/types.h>
7
+ #include <sys/wait.h>
8
+ #include <unistd.h>
9
+ #include <errno.h>
10
+
11
+ #include "liburing.h"
12
+
13
+ static void loop(void)
14
+ {
15
+ int i, ret = 0;
16
+
17
+ for (i = 0; i < 100; i++) {
18
+ struct io_uring ring;
19
+ int fd;
20
+
21
+ memset(&ring, 0, sizeof(ring));
22
+ fd = io_uring_queue_init(0xa4, &ring, 0);
23
+ if (fd >= 0) {
24
+ close(fd);
25
+ continue;
26
+ }
27
+ if (fd != -ENOMEM)
28
+ ret++;
29
+ }
30
+ exit(ret);
31
+ }
32
+
33
+ int main(int argc, char *argv[])
34
+ {
35
+ int i, ret, status;
36
+
37
+ if (argc > 1)
38
+ return 0;
39
+
40
+ for (i = 0; i < 12; i++) {
41
+ if (!fork()) {
42
+ loop();
43
+ break;
44
+ }
45
+ }
46
+
47
+ ret = 0;
48
+ for (i = 0; i < 12; i++) {
49
+ if (waitpid(-1, &status, 0) < 0) {
50
+ perror("waitpid");
51
+ return 1;
52
+ }
53
+ if (WEXITSTATUS(status))
54
+ ret++;
55
+ }
56
+
57
+ return ret;
58
+ }
@@ -0,0 +1,36 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Test configs for tests.
4
+ */
5
+ #ifndef LIBURING_TEST_H
6
+ #define LIBURING_TEST_H
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ typedef struct io_uring_test_config {
13
+ unsigned int flags;
14
+ const char *description;
15
+ } io_uring_test_config;
16
+
17
+ __attribute__((__unused__))
18
+ static io_uring_test_config io_uring_test_configs[] = {
19
+ { 0, "default" },
20
+ { IORING_SETUP_SQE128, "large SQE"},
21
+ { IORING_SETUP_CQE32, "large CQE"},
22
+ { IORING_SETUP_SQE128 | IORING_SETUP_CQE32, "large SQE/CQE" },
23
+ };
24
+
25
+ #define FOR_ALL_TEST_CONFIGS \
26
+ for (int i = 0; i < sizeof(io_uring_test_configs) / sizeof(io_uring_test_configs[0]); i++)
27
+
28
+ #define IORING_GET_TEST_CONFIG_FLAGS() (io_uring_test_configs[i].flags)
29
+ #define IORING_GET_TEST_CONFIG_DESCRIPTION() (io_uring_test_configs[i].description)
30
+
31
+
32
+ #ifdef __cplusplus
33
+ }
34
+ #endif
35
+
36
+ #endif
@@ -0,0 +1,143 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: test that thread pool issued requests don't cancel on thread
4
+ * exit, but do get canceled once the parent exits. Do both
5
+ * writes that finish and a poll request that sticks around.
6
+ *
7
+ */
8
+ #include <errno.h>
9
+ #include <stdio.h>
10
+ #include <unistd.h>
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+ #include <fcntl.h>
14
+ #include <poll.h>
15
+ #include <pthread.h>
16
+
17
+ #include "helpers.h"
18
+ #include "liburing.h"
19
+
20
+ #define NR_IOS 8
21
+ #define WSIZE 512
22
+
23
+ struct d {
24
+ int fd;
25
+ struct io_uring *ring;
26
+ unsigned long off;
27
+ int pipe_fd;
28
+ int err;
29
+ int i;
30
+ };
31
+
32
+ static char *g_buf[NR_IOS] = {NULL};
33
+
34
+ static void free_g_buf(void)
35
+ {
36
+ int i;
37
+ for (i = 0; i < NR_IOS; i++)
38
+ free(g_buf[i]);
39
+ }
40
+
41
+ static void *do_io(void *data)
42
+ {
43
+ struct d *d = data;
44
+ struct io_uring_sqe *sqe;
45
+ char *buffer;
46
+ int ret;
47
+
48
+ buffer = t_malloc(WSIZE);
49
+ g_buf[d->i] = buffer;
50
+ memset(buffer, 0x5a, WSIZE);
51
+ sqe = io_uring_get_sqe(d->ring);
52
+ if (!sqe) {
53
+ d->err++;
54
+ return NULL;
55
+ }
56
+ io_uring_prep_write(sqe, d->fd, buffer, WSIZE, d->off);
57
+ sqe->user_data = d->off;
58
+
59
+ sqe = io_uring_get_sqe(d->ring);
60
+ if (!sqe) {
61
+ d->err++;
62
+ return NULL;
63
+ }
64
+ io_uring_prep_poll_add(sqe, d->pipe_fd, POLLIN);
65
+
66
+ ret = io_uring_submit(d->ring);
67
+ if (ret != 2)
68
+ d->err++;
69
+ return NULL;
70
+ }
71
+
72
+ int main(int argc, char *argv[])
73
+ {
74
+ struct io_uring ring;
75
+ const char *fname;
76
+ pthread_t thread;
77
+ int ret, do_unlink, i, fd;
78
+ struct d d;
79
+ int fds[2];
80
+
81
+ if (pipe(fds) < 0) {
82
+ perror("pipe");
83
+ return 1;
84
+ }
85
+
86
+ ret = io_uring_queue_init(32, &ring, 0);
87
+ if (ret) {
88
+ fprintf(stderr, "ring setup failed\n");
89
+ return 1;
90
+ }
91
+
92
+ if (argc > 1) {
93
+ fname = argv[1];
94
+ do_unlink = 0;
95
+ } else {
96
+ fname = ".thread.exit";
97
+ do_unlink = 1;
98
+ t_create_file(fname, 4096);
99
+ }
100
+
101
+ fd = open(fname, O_WRONLY);
102
+ if (do_unlink)
103
+ unlink(fname);
104
+ if (fd < 0) {
105
+ perror("open");
106
+ return 1;
107
+ }
108
+
109
+ d.fd = fd;
110
+ d.ring = &ring;
111
+ d.off = 0;
112
+ d.pipe_fd = fds[0];
113
+ d.err = 0;
114
+ for (i = 0; i < NR_IOS; i++) {
115
+ d.i = i;
116
+ memset(&thread, 0, sizeof(thread));
117
+ pthread_create(&thread, NULL, do_io, &d);
118
+ pthread_join(thread, NULL);
119
+ d.off += WSIZE;
120
+ }
121
+
122
+ for (i = 0; i < NR_IOS; i++) {
123
+ struct io_uring_cqe *cqe;
124
+
125
+ ret = io_uring_wait_cqe(&ring, &cqe);
126
+ if (ret) {
127
+ fprintf(stderr, "io_uring_wait_cqe=%d\n", ret);
128
+ goto err;
129
+ }
130
+ if (cqe->res != WSIZE) {
131
+ fprintf(stderr, "cqe->res=%d, Expected %d\n", cqe->res,
132
+ WSIZE);
133
+ goto err;
134
+ }
135
+ io_uring_cqe_seen(&ring, cqe);
136
+ }
137
+
138
+ free_g_buf();
139
+ return d.err;
140
+ err:
141
+ free_g_buf();
142
+ return 1;
143
+ }