polyphony 0.93 → 0.95

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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +2 -2
  3. data/.gitignore +3 -3
  4. data/CHANGELOG.md +14 -0
  5. data/docs/api-reference/fiber.md +2 -2
  6. data/docs/api-reference/object.md +3 -3
  7. data/docs/main-concepts/exception-handling.md +2 -2
  8. data/examples/pipes/echo_server.rb +1 -1
  9. data/examples/pipes/http_server.rb +33 -0
  10. data/ext/polyphony/backend_common.c +53 -8
  11. data/ext/polyphony/backend_common.h +21 -13
  12. data/ext/polyphony/backend_io_uring.c +85 -147
  13. data/ext/polyphony/backend_libev.c +58 -89
  14. data/ext/polyphony/event.c +1 -1
  15. data/ext/polyphony/extconf.rb +7 -5
  16. data/ext/polyphony/fiber.c +5 -13
  17. data/ext/polyphony/io_extensions.c +68 -68
  18. data/ext/polyphony/pipe.c +1 -1
  19. data/ext/polyphony/polyphony.c +23 -23
  20. data/ext/polyphony/polyphony.h +0 -9
  21. data/ext/polyphony/polyphony_ext.c +1 -1
  22. data/ext/polyphony/queue.c +1 -1
  23. data/ext/polyphony/ring_buffer.c +1 -0
  24. data/ext/polyphony/socket_extensions.c +1 -1
  25. data/ext/polyphony/thread.c +1 -1
  26. data/lib/polyphony/extensions/enumerator.rb +16 -0
  27. data/lib/polyphony/extensions/socket.rb +2 -0
  28. data/lib/polyphony/extensions.rb +1 -0
  29. data/lib/polyphony/version.rb +1 -1
  30. data/polyphony.gemspec +2 -2
  31. data/test/test_backend.rb +5 -1
  32. data/test/test_enumerator.rb +46 -0
  33. data/test/test_global_api.rb +1 -1
  34. data/test/test_io.rb +241 -216
  35. data/test/test_socket.rb +1 -1
  36. data/test/test_thread_pool.rb +3 -3
  37. data/vendor/liburing/.github/workflows/build.yml +51 -5
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +1 -1
  39. data/vendor/liburing/.gitignore +6 -123
  40. data/vendor/liburing/CHANGELOG +35 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/LICENSE +16 -3
  43. data/vendor/liburing/Makefile +3 -1
  44. data/vendor/liburing/Makefile.common +1 -0
  45. data/vendor/liburing/README +14 -2
  46. data/vendor/liburing/SECURITY.md +6 -0
  47. data/vendor/liburing/configure +16 -15
  48. data/vendor/liburing/examples/Makefile +4 -1
  49. data/vendor/liburing/examples/io_uring-udp.c +395 -0
  50. data/vendor/liburing/examples/poll-bench.c +101 -0
  51. data/vendor/liburing/examples/send-zerocopy.c +339 -0
  52. data/vendor/liburing/liburing.spec +1 -1
  53. data/vendor/liburing/man/io_uring.7 +38 -11
  54. data/vendor/liburing/man/io_uring_buf_ring_add.3 +53 -0
  55. data/vendor/liburing/man/io_uring_buf_ring_advance.3 +31 -0
  56. data/vendor/liburing/man/io_uring_buf_ring_cq_advance.3 +41 -0
  57. data/vendor/liburing/man/io_uring_buf_ring_init.3 +30 -0
  58. data/vendor/liburing/man/io_uring_buf_ring_mask.3 +27 -0
  59. data/vendor/liburing/man/io_uring_cq_advance.3 +29 -15
  60. data/vendor/liburing/man/io_uring_cq_has_overflow.3 +25 -0
  61. data/vendor/liburing/man/io_uring_cq_ready.3 +9 -8
  62. data/vendor/liburing/man/io_uring_cqe_get_data.3 +32 -13
  63. data/vendor/liburing/man/io_uring_cqe_get_data64.3 +1 -0
  64. data/vendor/liburing/man/io_uring_cqe_seen.3 +22 -12
  65. data/vendor/liburing/man/io_uring_enter.2 +249 -32
  66. data/vendor/liburing/man/io_uring_enter2.2 +1 -0
  67. data/vendor/liburing/man/io_uring_free_probe.3 +11 -8
  68. data/vendor/liburing/man/io_uring_get_events.3 +33 -0
  69. data/vendor/liburing/man/io_uring_get_probe.3 +9 -8
  70. data/vendor/liburing/man/io_uring_get_sqe.3 +29 -10
  71. data/vendor/liburing/man/io_uring_opcode_supported.3 +11 -10
  72. data/vendor/liburing/man/io_uring_peek_cqe.3 +38 -0
  73. data/vendor/liburing/man/io_uring_prep_accept.3 +197 -0
  74. data/vendor/liburing/man/io_uring_prep_accept_direct.3 +1 -0
  75. data/vendor/liburing/man/io_uring_prep_cancel.3 +118 -0
  76. data/vendor/liburing/man/io_uring_prep_cancel64.3 +1 -0
  77. data/vendor/liburing/man/io_uring_prep_close.3 +59 -0
  78. data/vendor/liburing/man/io_uring_prep_close_direct.3 +1 -0
  79. data/vendor/liburing/man/io_uring_prep_connect.3 +66 -0
  80. data/vendor/liburing/man/io_uring_prep_fadvise.3 +59 -0
  81. data/vendor/liburing/man/io_uring_prep_fallocate.3 +59 -0
  82. data/vendor/liburing/man/io_uring_prep_files_update.3 +92 -0
  83. data/vendor/liburing/man/io_uring_prep_fsync.3 +70 -0
  84. data/vendor/liburing/man/io_uring_prep_link.3 +1 -0
  85. data/vendor/liburing/man/io_uring_prep_linkat.3 +91 -0
  86. data/vendor/liburing/man/io_uring_prep_madvise.3 +56 -0
  87. data/vendor/liburing/man/io_uring_prep_mkdir.3 +1 -0
  88. data/vendor/liburing/man/io_uring_prep_mkdirat.3 +83 -0
  89. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +39 -25
  90. data/vendor/liburing/man/io_uring_prep_multishot_accept.3 +1 -0
  91. data/vendor/liburing/man/io_uring_prep_multishot_accept_direct.3 +1 -0
  92. data/vendor/liburing/man/io_uring_prep_nop.3 +28 -0
  93. data/vendor/liburing/man/io_uring_prep_openat.3 +117 -0
  94. data/vendor/liburing/man/io_uring_prep_openat2.3 +117 -0
  95. data/vendor/liburing/man/io_uring_prep_openat2_direct.3 +1 -0
  96. data/vendor/liburing/man/io_uring_prep_openat_direct.3 +1 -0
  97. data/vendor/liburing/man/io_uring_prep_poll_add.3 +72 -0
  98. data/vendor/liburing/man/io_uring_prep_poll_multishot.3 +1 -0
  99. data/vendor/liburing/man/io_uring_prep_poll_remove.3 +55 -0
  100. data/vendor/liburing/man/io_uring_prep_poll_update.3 +89 -0
  101. data/vendor/liburing/man/io_uring_prep_provide_buffers.3 +131 -0
  102. data/vendor/liburing/man/io_uring_prep_read.3 +33 -14
  103. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +39 -21
  104. data/vendor/liburing/man/io_uring_prep_readv.3 +49 -15
  105. data/vendor/liburing/man/io_uring_prep_readv2.3 +49 -17
  106. data/vendor/liburing/man/io_uring_prep_recv.3 +105 -0
  107. data/vendor/liburing/man/io_uring_prep_recv_multishot.3 +1 -0
  108. data/vendor/liburing/man/io_uring_prep_recvmsg.3 +124 -0
  109. data/vendor/liburing/man/io_uring_prep_recvmsg_multishot.3 +1 -0
  110. data/vendor/liburing/man/io_uring_prep_remove_buffers.3 +52 -0
  111. data/vendor/liburing/man/io_uring_prep_rename.3 +1 -0
  112. data/vendor/liburing/man/io_uring_prep_renameat.3 +96 -0
  113. data/vendor/liburing/man/io_uring_prep_send.3 +57 -0
  114. data/vendor/liburing/man/io_uring_prep_send_zc.3 +64 -0
  115. data/vendor/liburing/man/io_uring_prep_sendmsg.3 +69 -0
  116. data/vendor/liburing/man/io_uring_prep_shutdown.3 +53 -0
  117. data/vendor/liburing/man/io_uring_prep_socket.3 +118 -0
  118. data/vendor/liburing/man/io_uring_prep_socket_direct.3 +1 -0
  119. data/vendor/liburing/man/io_uring_prep_socket_direct_alloc.3 +1 -0
  120. data/vendor/liburing/man/io_uring_prep_splice.3 +80 -0
  121. data/vendor/liburing/man/io_uring_prep_statx.3 +74 -0
  122. data/vendor/liburing/man/io_uring_prep_symlink.3 +1 -0
  123. data/vendor/liburing/man/io_uring_prep_symlinkat.3 +85 -0
  124. data/vendor/liburing/man/io_uring_prep_sync_file_range.3 +59 -0
  125. data/vendor/liburing/man/io_uring_prep_tee.3 +74 -0
  126. data/vendor/liburing/man/io_uring_prep_timeout.3 +95 -0
  127. data/vendor/liburing/man/io_uring_prep_timeout_remove.3 +1 -0
  128. data/vendor/liburing/man/io_uring_prep_timeout_update.3 +98 -0
  129. data/vendor/liburing/man/io_uring_prep_unlink.3 +1 -0
  130. data/vendor/liburing/man/io_uring_prep_unlinkat.3 +82 -0
  131. data/vendor/liburing/man/io_uring_prep_write.3 +32 -15
  132. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +39 -21
  133. data/vendor/liburing/man/io_uring_prep_writev.3 +50 -16
  134. data/vendor/liburing/man/io_uring_prep_writev2.3 +50 -17
  135. data/vendor/liburing/man/io_uring_queue_exit.3 +3 -4
  136. data/vendor/liburing/man/io_uring_queue_init.3 +58 -13
  137. data/vendor/liburing/man/io_uring_queue_init_params.3 +1 -0
  138. data/vendor/liburing/man/io_uring_recvmsg_cmsg_firsthdr.3 +1 -0
  139. data/vendor/liburing/man/io_uring_recvmsg_cmsg_nexthdr.3 +1 -0
  140. data/vendor/liburing/man/io_uring_recvmsg_name.3 +1 -0
  141. data/vendor/liburing/man/io_uring_recvmsg_out.3 +78 -0
  142. data/vendor/liburing/man/io_uring_recvmsg_payload.3 +1 -0
  143. data/vendor/liburing/man/io_uring_recvmsg_payload_length.3 +1 -0
  144. data/vendor/liburing/man/io_uring_recvmsg_validate.3 +1 -0
  145. data/vendor/liburing/man/io_uring_register.2 +153 -13
  146. data/vendor/liburing/man/io_uring_register_buf_ring.3 +140 -0
  147. data/vendor/liburing/man/io_uring_register_buffers.3 +32 -12
  148. data/vendor/liburing/man/io_uring_register_eventfd.3 +51 -0
  149. data/vendor/liburing/man/io_uring_register_eventfd_async.3 +1 -0
  150. data/vendor/liburing/man/io_uring_register_file_alloc_range.3 +52 -0
  151. data/vendor/liburing/man/io_uring_register_files.3 +33 -11
  152. data/vendor/liburing/man/io_uring_register_files_sparse.3 +1 -0
  153. data/vendor/liburing/man/io_uring_register_iowq_aff.3 +61 -0
  154. data/vendor/liburing/man/io_uring_register_iowq_max_workers.3 +71 -0
  155. data/vendor/liburing/man/io_uring_register_ring_fd.3 +49 -0
  156. data/vendor/liburing/man/io_uring_register_sync_cancel.3 +71 -0
  157. data/vendor/liburing/man/io_uring_setup.2 +119 -13
  158. data/vendor/liburing/man/io_uring_sq_ready.3 +14 -8
  159. data/vendor/liburing/man/io_uring_sq_space_left.3 +9 -9
  160. data/vendor/liburing/man/io_uring_sqe_set_data.3 +29 -11
  161. data/vendor/liburing/man/io_uring_sqe_set_data64.3 +1 -0
  162. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +38 -11
  163. data/vendor/liburing/man/io_uring_sqring_wait.3 +13 -9
  164. data/vendor/liburing/man/io_uring_submit.3 +29 -12
  165. data/vendor/liburing/man/io_uring_submit_and_get_events.3 +31 -0
  166. data/vendor/liburing/man/io_uring_submit_and_wait.3 +16 -12
  167. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +30 -23
  168. data/vendor/liburing/man/io_uring_unregister_buf_ring.3 +30 -0
  169. data/vendor/liburing/man/io_uring_unregister_buffers.3 +11 -10
  170. data/vendor/liburing/man/io_uring_unregister_eventfd.3 +1 -0
  171. data/vendor/liburing/man/io_uring_unregister_files.3 +11 -10
  172. data/vendor/liburing/man/io_uring_unregister_iowq_aff.3 +1 -0
  173. data/vendor/liburing/man/io_uring_unregister_ring_fd.3 +32 -0
  174. data/vendor/liburing/man/io_uring_wait_cqe.3 +19 -12
  175. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +21 -14
  176. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +27 -13
  177. data/vendor/liburing/man/io_uring_wait_cqes.3 +24 -14
  178. data/vendor/liburing/src/Makefile +8 -7
  179. data/vendor/liburing/src/arch/aarch64/lib.h +48 -0
  180. data/vendor/liburing/src/arch/aarch64/syscall.h +0 -4
  181. data/vendor/liburing/src/arch/generic/lib.h +0 -4
  182. data/vendor/liburing/src/arch/generic/syscall.h +29 -16
  183. data/vendor/liburing/src/arch/syscall-defs.h +41 -14
  184. data/vendor/liburing/src/arch/x86/lib.h +0 -21
  185. data/vendor/liburing/src/arch/x86/syscall.h +146 -10
  186. data/vendor/liburing/src/include/liburing/io_uring.h +245 -5
  187. data/vendor/liburing/src/include/liburing.h +468 -35
  188. data/vendor/liburing/src/int_flags.h +1 -0
  189. data/vendor/liburing/src/lib.h +20 -16
  190. data/vendor/liburing/src/liburing.map +16 -0
  191. data/vendor/liburing/src/nolibc.c +1 -1
  192. data/vendor/liburing/src/queue.c +87 -55
  193. data/vendor/liburing/src/register.c +129 -53
  194. data/vendor/liburing/src/setup.c +65 -28
  195. data/vendor/liburing/src/syscall.c +14 -32
  196. data/vendor/liburing/src/syscall.h +12 -64
  197. data/vendor/liburing/test/{232c93d07b74-test.c → 232c93d07b74.c} +8 -9
  198. data/vendor/liburing/test/{35fa71a030ca-test.c → 35fa71a030ca.c} +4 -4
  199. data/vendor/liburing/test/{500f9fbadef8-test.c → 500f9fbadef8.c} +7 -7
  200. data/vendor/liburing/test/{7ad0e4b2f83c-test.c → 7ad0e4b2f83c.c} +8 -7
  201. data/vendor/liburing/test/{8a9973408177-test.c → 8a9973408177.c} +4 -3
  202. data/vendor/liburing/test/{917257daa0fe-test.c → 917257daa0fe.c} +3 -2
  203. data/vendor/liburing/test/Makefile +60 -62
  204. data/vendor/liburing/test/{a0908ae19763-test.c → a0908ae19763.c} +3 -2
  205. data/vendor/liburing/test/{a4c0b3decb33-test.c → a4c0b3decb33.c} +3 -2
  206. data/vendor/liburing/test/accept-link.c +5 -4
  207. data/vendor/liburing/test/accept-reuse.c +17 -16
  208. data/vendor/liburing/test/accept-test.c +14 -10
  209. data/vendor/liburing/test/accept.c +529 -107
  210. data/vendor/liburing/test/across-fork.c +7 -6
  211. data/vendor/liburing/test/{b19062a56726-test.c → b19062a56726.c} +3 -2
  212. data/vendor/liburing/test/{b5837bd5311d-test.c → b5837bd5311d.c} +10 -9
  213. data/vendor/liburing/test/buf-ring.c +420 -0
  214. data/vendor/liburing/test/{ce593a6c480a-test.c → ce593a6c480a.c} +15 -12
  215. data/vendor/liburing/test/connect.c +8 -7
  216. data/vendor/liburing/test/cq-full.c +5 -4
  217. data/vendor/liburing/test/cq-overflow.c +242 -12
  218. data/vendor/liburing/test/cq-peek-batch.c +5 -4
  219. data/vendor/liburing/test/cq-ready.c +5 -4
  220. data/vendor/liburing/test/cq-size.c +5 -4
  221. data/vendor/liburing/test/{d4ae271dfaae-test.c → d4ae271dfaae.c} +2 -2
  222. data/vendor/liburing/test/{d77a67ed5f27-test.c → d77a67ed5f27.c} +6 -6
  223. data/vendor/liburing/test/defer-taskrun.c +336 -0
  224. data/vendor/liburing/test/defer.c +26 -14
  225. data/vendor/liburing/test/double-poll-crash.c +15 -5
  226. data/vendor/liburing/test/drop-submit.c +5 -3
  227. data/vendor/liburing/test/{eeed8b54e0df-test.c → eeed8b54e0df.c} +7 -6
  228. data/vendor/liburing/test/empty-eownerdead.c +4 -4
  229. data/vendor/liburing/test/eventfd-disable.c +48 -20
  230. data/vendor/liburing/test/eventfd-reg.c +10 -9
  231. data/vendor/liburing/test/eventfd-ring.c +13 -12
  232. data/vendor/liburing/test/eventfd.c +13 -12
  233. data/vendor/liburing/test/exit-no-cleanup.c +1 -1
  234. data/vendor/liburing/test/fadvise.c +3 -3
  235. data/vendor/liburing/test/fallocate.c +16 -9
  236. data/vendor/liburing/test/{fc2a85cb02ef-test.c → fc2a85cb02ef.c} +4 -3
  237. data/vendor/liburing/test/fd-pass.c +187 -0
  238. data/vendor/liburing/test/file-register.c +302 -36
  239. data/vendor/liburing/test/file-update.c +62 -4
  240. data/vendor/liburing/test/file-verify.c +6 -2
  241. data/vendor/liburing/test/files-exit-hang-poll.c +11 -25
  242. data/vendor/liburing/test/files-exit-hang-timeout.c +13 -10
  243. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  244. data/vendor/liburing/test/fixed-link.c +10 -10
  245. data/vendor/liburing/test/fixed-reuse.c +160 -0
  246. data/vendor/liburing/test/fpos.c +6 -3
  247. data/vendor/liburing/test/fsync.c +3 -3
  248. data/vendor/liburing/test/hardlink.c +10 -6
  249. data/vendor/liburing/test/helpers.c +137 -4
  250. data/vendor/liburing/test/helpers.h +27 -0
  251. data/vendor/liburing/test/io-cancel.c +16 -11
  252. data/vendor/liburing/test/io_uring_enter.c +46 -81
  253. data/vendor/liburing/test/io_uring_passthrough.c +451 -0
  254. data/vendor/liburing/test/io_uring_register.c +59 -229
  255. data/vendor/liburing/test/io_uring_setup.c +24 -29
  256. data/vendor/liburing/test/iopoll-leak.c +85 -0
  257. data/vendor/liburing/test/iopoll.c +16 -9
  258. data/vendor/liburing/test/lfs-openat-write.c +3 -1
  259. data/vendor/liburing/test/link-timeout.c +4 -3
  260. data/vendor/liburing/test/link.c +8 -7
  261. data/vendor/liburing/test/madvise.c +2 -2
  262. data/vendor/liburing/test/mkdir.c +9 -5
  263. data/vendor/liburing/test/msg-ring.c +46 -20
  264. data/vendor/liburing/test/multicqes_drain.c +51 -12
  265. data/vendor/liburing/test/nolibc.c +60 -0
  266. data/vendor/liburing/test/nop.c +78 -16
  267. data/vendor/liburing/test/nvme.h +168 -0
  268. data/vendor/liburing/test/open-direct-link.c +188 -0
  269. data/vendor/liburing/test/open-direct-pick.c +180 -0
  270. data/vendor/liburing/test/openat2.c +3 -3
  271. data/vendor/liburing/test/poll-cancel-all.c +472 -0
  272. data/vendor/liburing/test/poll-link.c +9 -18
  273. data/vendor/liburing/test/poll-mshot-overflow.c +162 -0
  274. data/vendor/liburing/test/poll-mshot-update.c +83 -33
  275. data/vendor/liburing/test/pollfree.c +2 -2
  276. data/vendor/liburing/test/read-before-exit.c +112 -0
  277. data/vendor/liburing/test/read-write.c +83 -1
  278. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  279. data/vendor/liburing/test/recv-msgall.c +265 -0
  280. data/vendor/liburing/test/recv-multishot.c +505 -0
  281. data/vendor/liburing/test/rename.c +2 -5
  282. data/vendor/liburing/test/ring-leak.c +97 -0
  283. data/vendor/liburing/test/ringbuf-read.c +200 -0
  284. data/vendor/liburing/test/rsrc_tags.c +25 -13
  285. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  286. data/vendor/liburing/test/runtests.sh +18 -20
  287. data/vendor/liburing/test/rw_merge_test.c +3 -2
  288. data/vendor/liburing/test/send-zerocopy.c +684 -0
  289. data/vendor/liburing/test/send_recv.c +49 -2
  290. data/vendor/liburing/test/send_recvmsg.c +165 -55
  291. data/vendor/liburing/test/shutdown.c +3 -4
  292. data/vendor/liburing/test/sigfd-deadlock.c +22 -8
  293. data/vendor/liburing/test/single-issuer.c +171 -0
  294. data/vendor/liburing/test/socket-rw-eagain.c +2 -12
  295. data/vendor/liburing/test/socket-rw-offset.c +2 -11
  296. data/vendor/liburing/test/socket-rw.c +2 -11
  297. data/vendor/liburing/test/socket.c +409 -0
  298. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  299. data/vendor/liburing/test/sq-poll-share.c +1 -1
  300. data/vendor/liburing/test/statx.c +2 -2
  301. data/vendor/liburing/test/submit-and-wait.c +108 -0
  302. data/vendor/liburing/test/submit-link-fail.c +5 -3
  303. data/vendor/liburing/test/submit-reuse.c +0 -2
  304. data/vendor/liburing/test/sync-cancel.c +235 -0
  305. data/vendor/liburing/test/test.h +35 -0
  306. data/vendor/liburing/test/timeout-overflow.c +11 -11
  307. data/vendor/liburing/test/timeout.c +7 -7
  308. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  309. data/vendor/liburing/test/unlink.c +1 -1
  310. data/vendor/liburing/test/xattr.c +425 -0
  311. metadata +148 -26
  312. data/Gemfile.lock +0 -82
@@ -430,6 +430,10 @@ static int test(struct io_uring *ring, const char *fname, int buffered,
430
430
  fprintf(stderr, "bad read %d, read %d\n", cqe->res, i);
431
431
  goto err;
432
432
  }
433
+ if (cqe->res < CHUNK_SIZE) {
434
+ fprintf(stderr, "short read %d, read %d\n", cqe->res, i);
435
+ goto err;
436
+ }
433
437
  if (cqe->flags & IORING_CQE_F_BUFFER)
434
438
  index = cqe->flags >> 16;
435
439
  else
@@ -621,9 +625,9 @@ int main(int argc, char *argv[])
621
625
 
622
626
  if (buf == fname)
623
627
  unlink(fname);
624
- return 0;
628
+ return T_EXIT_PASS;
625
629
  err:
626
630
  if (buf == fname)
627
631
  unlink(fname);
628
- return 1;
632
+ return T_EXIT_FAIL;
629
633
  }
@@ -15,11 +15,10 @@
15
15
  #include <unistd.h>
16
16
  #include <poll.h>
17
17
  #include "liburing.h"
18
+ #include "helpers.h"
18
19
 
19
20
  #define BACKLOG 512
20
21
 
21
- #define PORT 9100
22
-
23
22
  static struct io_uring ring;
24
23
 
25
24
  static void add_poll(struct io_uring *ring, int fd)
@@ -63,15 +62,14 @@ int main(int argc, char *argv[])
63
62
  struct io_uring_cqe *cqe;
64
63
  int ret, sock_listen_fd;
65
64
  const int val = 1;
66
- int i;
67
65
 
68
66
  if (argc > 1)
69
- return 0;
67
+ return T_EXIT_SKIP;
70
68
 
71
69
  sock_listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
72
70
  if (sock_listen_fd < 0) {
73
71
  perror("socket");
74
- return 1;
72
+ return T_EXIT_FAIL;
75
73
  }
76
74
 
77
75
  setsockopt(sock_listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
@@ -80,29 +78,18 @@ int main(int argc, char *argv[])
80
78
  serv_addr.sin_family = AF_INET;
81
79
  serv_addr.sin_addr.s_addr = INADDR_ANY;
82
80
 
83
- for (i = 0; i < 100; i++) {
84
- serv_addr.sin_port = htons(PORT + i);
85
-
86
- ret = bind(sock_listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
87
- if (!ret)
88
- break;
89
- if (errno != EADDRINUSE) {
90
- fprintf(stderr, "bind: %s\n", strerror(errno));
91
- return 1;
92
- }
93
- if (i == 99) {
94
- printf("Gave up on finding a port, skipping\n");
95
- goto out;
96
- }
81
+ if (t_bind_ephemeral_port(sock_listen_fd, &serv_addr)) {
82
+ perror("bind");
83
+ return T_EXIT_FAIL;
97
84
  }
98
85
 
99
86
  if (listen(sock_listen_fd, BACKLOG) < 0) {
100
87
  perror("Error listening on socket\n");
101
- return 1;
88
+ return T_EXIT_FAIL;
102
89
  }
103
90
 
104
91
  if (setup_io_uring())
105
- return 1;
92
+ return T_EXIT_FAIL;
106
93
 
107
94
  add_poll(&ring, sock_listen_fd);
108
95
  add_accept(&ring, sock_listen_fd);
@@ -110,7 +97,7 @@ int main(int argc, char *argv[])
110
97
  ret = io_uring_submit(&ring);
111
98
  if (ret != 2) {
112
99
  fprintf(stderr, "submit=%d\n", ret);
113
- return 1;
100
+ return T_EXIT_FAIL;
114
101
  }
115
102
 
116
103
  signal(SIGALRM, alarm_sig);
@@ -119,10 +106,9 @@ int main(int argc, char *argv[])
119
106
  ret = io_uring_wait_cqe(&ring, &cqe);
120
107
  if (ret) {
121
108
  fprintf(stderr, "wait_cqe=%d\n", ret);
122
- return 1;
109
+ return T_EXIT_FAIL;
123
110
  }
124
111
 
125
- out:
126
112
  io_uring_queue_exit(&ring);
127
- return 0;
113
+ return T_EXIT_PASS;
128
114
  }
@@ -15,6 +15,7 @@
15
15
  #include <unistd.h>
16
16
  #include <poll.h>
17
17
  #include "liburing.h"
18
+ #include "helpers.h"
18
19
 
19
20
  #define BACKLOG 512
20
21
 
@@ -72,12 +73,12 @@ int main(int argc, char *argv[])
72
73
  int i;
73
74
 
74
75
  if (argc > 1)
75
- return 0;
76
+ return T_EXIT_SKIP;
76
77
 
77
78
  sock_listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
78
79
  if (sock_listen_fd < 0) {
79
80
  perror("socket");
80
- return 1;
81
+ return T_EXIT_FAIL;
81
82
  }
82
83
 
83
84
  setsockopt(sock_listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
@@ -94,21 +95,21 @@ int main(int argc, char *argv[])
94
95
  break;
95
96
  if (errno != EADDRINUSE) {
96
97
  fprintf(stderr, "bind: %s\n", strerror(errno));
97
- return 1;
98
+ return T_EXIT_FAIL;
98
99
  }
99
100
  if (i == 99) {
100
101
  printf("Gave up on finding a port, skipping\n");
101
- goto out;
102
+ goto skip;
102
103
  }
103
104
  }
104
105
 
105
106
  if (listen(sock_listen_fd, BACKLOG) < 0) {
106
107
  perror("Error listening on socket\n");
107
- return 1;
108
+ return T_EXIT_FAIL;
108
109
  }
109
110
 
110
111
  if (setup_io_uring())
111
- return 1;
112
+ return T_EXIT_FAIL;
112
113
 
113
114
  add_timeout(&ring, sock_listen_fd);
114
115
  add_accept(&ring, sock_listen_fd);
@@ -116,7 +117,7 @@ int main(int argc, char *argv[])
116
117
  ret = io_uring_submit(&ring);
117
118
  if (ret != 2) {
118
119
  fprintf(stderr, "submit=%d\n", ret);
119
- return 1;
120
+ return T_EXIT_FAIL;
120
121
  }
121
122
 
122
123
  signal(SIGALRM, alarm_sig);
@@ -125,10 +126,12 @@ int main(int argc, char *argv[])
125
126
  ret = io_uring_wait_cqe(&ring, &cqe);
126
127
  if (ret) {
127
128
  fprintf(stderr, "wait_cqe=%d\n", ret);
128
- return 1;
129
+ return T_EXIT_FAIL;
129
130
  }
130
131
 
131
- out:
132
132
  io_uring_queue_exit(&ring);
133
- return 0;
133
+ return T_EXIT_PASS;
134
+ skip:
135
+ io_uring_queue_exit(&ring);
136
+ return T_EXIT_SKIP;
134
137
  }
@@ -0,0 +1,115 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test fixed buffers with non-iterators.
4
+ *
5
+ * Taken from: https://github.com/axboe/liburing/issues/549
6
+ */
7
+ #include <stdio.h>
8
+ #include <string.h>
9
+ #include <fcntl.h>
10
+ #include <stdlib.h>
11
+
12
+ #include "liburing.h"
13
+ #include "helpers.h"
14
+
15
+ #define BUF_SIZE 4096
16
+ #define BUFFERS 1
17
+ #define IN_FD "/dev/urandom"
18
+ #define OUT_FD "/dev/zero"
19
+
20
+ static int test(struct io_uring *ring)
21
+ {
22
+ struct iovec iov[BUFFERS];
23
+ struct io_uring_sqe *sqe;
24
+ struct io_uring_cqe *cqe;
25
+ int ret, fd_in, fd_out, i;
26
+
27
+ fd_in = open(IN_FD, O_RDONLY, 0644);
28
+ if (fd_in < 0) {
29
+ perror("open in");
30
+ return 1;
31
+ }
32
+
33
+ fd_out = open(OUT_FD, O_RDWR, 0644);
34
+ if (fd_out < 0) {
35
+ perror("open out");
36
+ return 1;
37
+ }
38
+
39
+ for (i = 0; i < BUFFERS; i++) {
40
+ iov[i].iov_base = malloc(BUF_SIZE);
41
+ iov[i].iov_len = BUF_SIZE;
42
+ memset(iov[i].iov_base, 0, BUF_SIZE);
43
+ }
44
+
45
+ ret = io_uring_register_buffers(ring, iov, BUFFERS);
46
+ if (ret) {
47
+ fprintf(stderr, "Error registering buffers: %s", strerror(-ret));
48
+ return 1;
49
+ }
50
+
51
+ sqe = io_uring_get_sqe(ring);
52
+ if (!sqe) {
53
+ fprintf(stderr, "Could not get SQE.\n");
54
+ return 1;
55
+ }
56
+
57
+ io_uring_prep_read_fixed(sqe, fd_in, iov[0].iov_base, BUF_SIZE, 0, 0);
58
+ io_uring_submit(ring);
59
+
60
+ ret = io_uring_wait_cqe(ring, &cqe);
61
+ if (ret < 0) {
62
+ fprintf(stderr, "Error waiting for completion: %s\n", strerror(-ret));
63
+ return 1;
64
+ }
65
+
66
+ if (cqe->res < 0) {
67
+ fprintf(stderr, "Error in async operation: %s\n", strerror(-cqe->res));
68
+ return 1;
69
+ }
70
+ io_uring_cqe_seen(ring, cqe);
71
+
72
+ sqe = io_uring_get_sqe(ring);
73
+ if (!sqe) {
74
+ fprintf(stderr, "Could not get SQE.\n");
75
+ return 1;
76
+ }
77
+ io_uring_prep_write_fixed(sqe, fd_out, iov[0].iov_base, BUF_SIZE, 0, 0);
78
+ io_uring_submit(ring);
79
+
80
+ ret = io_uring_wait_cqe(ring, &cqe);
81
+ if (ret < 0) {
82
+ fprintf(stderr, "Error waiting for completion: %s\n", strerror(-ret));
83
+ return 1;
84
+ }
85
+ if (cqe->res < 0) {
86
+ fprintf(stderr, "Error in async operation: %s\n", strerror(-cqe->res));
87
+ return 1;
88
+ }
89
+ io_uring_cqe_seen(ring, cqe);
90
+ return 0;
91
+ }
92
+
93
+ int main(int argc, char *argv[])
94
+ {
95
+ struct io_uring ring;
96
+ int ret;
97
+
98
+ if (argc > 1)
99
+ return T_EXIT_SKIP;
100
+
101
+ ret = t_create_ring(8, &ring, 0);
102
+ if (ret == T_SETUP_SKIP)
103
+ return T_EXIT_SKIP;
104
+ else if (ret < 0)
105
+ return T_EXIT_FAIL;
106
+
107
+ ret = test(&ring);
108
+ if (ret) {
109
+ fprintf(stderr, "Test failed\n");
110
+ return T_EXIT_FAIL;
111
+ }
112
+
113
+ io_uring_queue_exit(&ring);
114
+ return T_EXIT_PASS;
115
+ }
@@ -19,18 +19,18 @@ int main(int argc, char *argv[])
19
19
  int i, fd, ret;
20
20
 
21
21
  if (argc > 1)
22
- return 0;
22
+ return T_EXIT_SKIP;
23
23
 
24
24
  fd = open("/dev/zero", O_RDONLY);
25
25
  if (fd < 0) {
26
26
  fprintf(stderr, "Failed to open /dev/zero\n");
27
- return 1;
27
+ return T_EXIT_FAIL;
28
28
  }
29
29
 
30
30
  if (io_uring_queue_init(32, &ring, 0) < 0) {
31
- fprintf(stderr, "Faild to init io_uring\n");
31
+ fprintf(stderr, "Failed to init io_uring\n");
32
32
  close(fd);
33
- return 1;
33
+ return T_EXIT_FAIL;
34
34
  }
35
35
 
36
36
  for (i = 0; i < IOVECS_LEN; ++i) {
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
41
41
  ret = io_uring_register_buffers(&ring, iovecs, IOVECS_LEN);
42
42
  if (ret) {
43
43
  fprintf(stderr, "Failed to register buffers\n");
44
- return 1;
44
+ return T_EXIT_FAIL;
45
45
  }
46
46
 
47
47
  for (i = 0; i < IOVECS_LEN; ++i) {
@@ -58,10 +58,10 @@ int main(int argc, char *argv[])
58
58
  ret = io_uring_submit_and_wait(&ring, IOVECS_LEN);
59
59
  if (ret < 0) {
60
60
  fprintf(stderr, "Failed to submit IO\n");
61
- return 1;
61
+ return T_EXIT_FAIL;
62
62
  } else if (ret < 2) {
63
63
  fprintf(stderr, "Submitted %d, wanted %d\n", ret, IOVECS_LEN);
64
- return 1;
64
+ return T_EXIT_FAIL;
65
65
  }
66
66
 
67
67
  for (i = 0; i < IOVECS_LEN; i++) {
@@ -70,12 +70,12 @@ int main(int argc, char *argv[])
70
70
  ret = io_uring_wait_cqe(&ring, &cqe);
71
71
  if (ret) {
72
72
  fprintf(stderr, "wait_cqe=%d\n", ret);
73
- return 1;
73
+ return T_EXIT_FAIL;
74
74
  }
75
75
  if (cqe->res != iovecs[i].iov_len) {
76
76
  fprintf(stderr, "read: wanted %ld, got %d\n",
77
77
  (long) iovecs[i].iov_len, cqe->res);
78
- return 1;
78
+ return T_EXIT_FAIL;
79
79
  }
80
80
  io_uring_cqe_seen(&ring, cqe);
81
81
  }
@@ -86,5 +86,5 @@ int main(int argc, char *argv[])
86
86
  for (i = 0; i < IOVECS_LEN; ++i)
87
87
  free(iovecs[i].iov_base);
88
88
 
89
- return 0;
89
+ return T_EXIT_PASS;
90
90
  }
@@ -0,0 +1,160 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: link <open file><read from file><close file> with an existing
4
+ * file present in the opened slot, verifying that we get the new file
5
+ * rather than the old one.
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
+
15
+ #include "liburing.h"
16
+ #include "helpers.h"
17
+
18
+ #define MAX_FILES 8
19
+ #define FNAME1 ".slot.reuse.1"
20
+ #define FNAME2 ".slot.reuse.2"
21
+ #define PAT1 0xaa
22
+ #define PAT2 0x55
23
+ #define BSIZE 4096
24
+
25
+ static int test(struct io_uring *ring)
26
+ {
27
+ struct io_uring_cqe *cqe;
28
+ struct io_uring_sqe *sqe;
29
+ char buf[BSIZE];
30
+ int ret, i;
31
+
32
+ /* open FNAME1 in slot 0 */
33
+ sqe = io_uring_get_sqe(ring);
34
+ io_uring_prep_openat_direct(sqe, AT_FDCWD, FNAME1, O_RDONLY, 0, 0);
35
+ sqe->user_data = 1;
36
+
37
+ ret = io_uring_submit(ring);
38
+ if (ret != 1) {
39
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
40
+ goto err;
41
+ }
42
+
43
+ ret = io_uring_wait_cqe(ring, &cqe);
44
+ if (ret < 0) {
45
+ fprintf(stderr, "wait completion %d\n", ret);
46
+ goto err;
47
+ }
48
+ if (cqe->res != 0) {
49
+ fprintf(stderr, "open res %d\n", ret);
50
+ goto err;
51
+ }
52
+ io_uring_cqe_seen(ring, cqe);
53
+
54
+ /*
55
+ * Now open FNAME2 in that same slot, verifying we get data from
56
+ * FNAME2 and not FNAME1.
57
+ */
58
+ sqe = io_uring_get_sqe(ring);
59
+ io_uring_prep_openat_direct(sqe, AT_FDCWD, FNAME2, O_RDONLY, 0, 0);
60
+ sqe->flags |= IOSQE_IO_LINK;
61
+ sqe->user_data = 2;
62
+
63
+ sqe = io_uring_get_sqe(ring);
64
+ io_uring_prep_read(sqe, 0, buf, sizeof(buf), 0);
65
+ sqe->flags |= IOSQE_FIXED_FILE;
66
+ sqe->flags |= IOSQE_IO_LINK;
67
+ sqe->user_data = 3;
68
+
69
+ sqe = io_uring_get_sqe(ring);
70
+ io_uring_prep_close_direct(sqe, 0);
71
+ sqe->user_data = 4;
72
+
73
+ ret = io_uring_submit(ring);
74
+ if (ret != 3) {
75
+ fprintf(stderr, "sqe submit failed: %d\n", ret);
76
+ goto err;
77
+ }
78
+
79
+ for (i = 0; i < 3; i++) {
80
+ ret = io_uring_wait_cqe(ring, &cqe);
81
+ if (ret < 0) {
82
+ fprintf(stderr, "wait completion %d\n", ret);
83
+ goto err;
84
+ }
85
+ switch (cqe->user_data) {
86
+ case 2:
87
+ if (cqe->res) {
88
+ fprintf(stderr, "bad open %d\n", cqe->res);
89
+ goto err;
90
+ }
91
+ break;
92
+ case 3:
93
+ if (cqe->res != sizeof(buf)) {
94
+ fprintf(stderr, "bad read %d\n", cqe->res);
95
+ goto err;
96
+ }
97
+ break;
98
+ case 4:
99
+ if (cqe->res) {
100
+ fprintf(stderr, "bad close %d\n", cqe->res);
101
+ goto err;
102
+ }
103
+ break;
104
+ }
105
+ io_uring_cqe_seen(ring, cqe);
106
+ }
107
+
108
+ for (i = 0; i < sizeof(buf); i++) {
109
+ if (buf[i] == PAT2)
110
+ continue;
111
+ fprintf(stderr, "Bad pattern %x at %d\n", buf[i], i);
112
+ goto err;
113
+ }
114
+
115
+ return 0;
116
+ err:
117
+ return 1;
118
+ }
119
+
120
+ int main(int argc, char *argv[])
121
+ {
122
+ struct io_uring ring;
123
+ struct io_uring_params p = { };
124
+ int ret, files[MAX_FILES];
125
+
126
+ if (argc > 1)
127
+ return T_EXIT_SKIP;
128
+
129
+ ret = io_uring_queue_init_params(8, &ring, &p);
130
+ if (ret) {
131
+ fprintf(stderr, "ring setup failed: %d\n", ret);
132
+ return T_EXIT_FAIL;
133
+ }
134
+ if (!(p.features & IORING_FEAT_CQE_SKIP))
135
+ return T_EXIT_SKIP;
136
+
137
+ memset(files, -1, sizeof(files));
138
+ ret = io_uring_register_files(&ring, files, ARRAY_SIZE(files));
139
+ if (ret) {
140
+ fprintf(stderr, "Failed registering files\n");
141
+ return T_EXIT_FAIL;
142
+ }
143
+
144
+ t_create_file_pattern(FNAME1, 4096, PAT1);
145
+ t_create_file_pattern(FNAME2, 4096, PAT2);
146
+
147
+ ret = test(&ring);
148
+ if (ret) {
149
+ fprintf(stderr, "test failed\n");
150
+ goto err;
151
+ }
152
+
153
+ unlink(FNAME1);
154
+ unlink(FNAME2);
155
+ return T_EXIT_PASS;
156
+ err:
157
+ unlink(FNAME1);
158
+ unlink(FNAME2);
159
+ return T_EXIT_FAIL;
160
+ }
@@ -52,6 +52,9 @@ static int test_read(struct io_uring *ring, bool async, int blocksize)
52
52
  unsigned char buff[QUEUE_SIZE * blocksize];
53
53
  unsigned char reordered[QUEUE_SIZE * blocksize];
54
54
 
55
+ memset(buff, 0, QUEUE_SIZE * blocksize);
56
+ memset(reordered, 0, QUEUE_SIZE * blocksize);
57
+
55
58
  create_file(".test_fpos_read", FILE_SIZE);
56
59
  fd = open(".test_fpos_read", O_RDONLY);
57
60
  unlink(".test_fpos_read");
@@ -225,12 +228,12 @@ int main(int argc, char *argv[])
225
228
  int ret;
226
229
 
227
230
  if (argc > 1)
228
- return 0;
231
+ return T_EXIT_SKIP;
229
232
 
230
233
  ret = io_uring_queue_init(QUEUE_SIZE, &ring, 0);
231
234
  if (ret) {
232
235
  fprintf(stderr, "ring setup failed\n");
233
- return 1;
236
+ return T_EXIT_FAIL;
234
237
  }
235
238
 
236
239
  for (int test = 0; test < 8; test++) {
@@ -248,5 +251,5 @@ int main(int argc, char *argv[])
248
251
  return -1;
249
252
  }
250
253
  }
251
- return 0;
254
+ return T_EXIT_PASS;
252
255
  }
@@ -193,12 +193,12 @@ int main(int argc, char *argv[])
193
193
  int ret;
194
194
 
195
195
  if (argc > 1)
196
- return 0;
196
+ return T_EXIT_SKIP;
197
197
 
198
198
  ret = io_uring_queue_init(8, &ring, 0);
199
199
  if (ret) {
200
200
  fprintf(stderr, "ring setup failed\n");
201
- return 1;
201
+ return T_EXIT_FAIL;
202
202
 
203
203
  }
204
204
 
@@ -220,5 +220,5 @@ int main(int argc, char *argv[])
220
220
  return ret;
221
221
  }
222
222
 
223
- return 0;
223
+ return T_EXIT_PASS;
224
224
  }
@@ -10,6 +10,7 @@
10
10
  #include <unistd.h>
11
11
 
12
12
  #include "liburing.h"
13
+ #include "helpers.h"
13
14
 
14
15
 
15
16
  static int do_linkat(struct io_uring *ring, const char *oldname, const char *newname)
@@ -74,7 +75,7 @@ int main(int argc, char *argv[])
74
75
  struct io_uring ring;
75
76
 
76
77
  if (argc > 1)
77
- return 0;
78
+ return T_EXIT_SKIP;
78
79
 
79
80
  ret = io_uring_queue_init(8, &ring, 0);
80
81
  if (ret) {
@@ -97,7 +98,7 @@ int main(int argc, char *argv[])
97
98
  if (ret < 0) {
98
99
  if (ret == -EBADF || ret == -EINVAL) {
99
100
  fprintf(stdout, "linkat not supported, skipping\n");
100
- goto out;
101
+ goto skip;
101
102
  }
102
103
  fprintf(stderr, "linkat: %s\n", strerror(-ret));
103
104
  goto err1;
@@ -120,17 +121,20 @@ int main(int argc, char *argv[])
120
121
  goto err2;
121
122
  }
122
123
 
123
- out:
124
124
  unlinkat(AT_FDCWD, linkname, 0);
125
125
  unlinkat(AT_FDCWD, target, 0);
126
126
  io_uring_queue_exit(&ring);
127
- return 0;
127
+ return T_EXIT_PASS;
128
+ skip:
129
+ unlinkat(AT_FDCWD, linkname, 0);
130
+ unlinkat(AT_FDCWD, target, 0);
131
+ io_uring_queue_exit(&ring);
132
+ return T_EXIT_SKIP;
128
133
  err2:
129
134
  unlinkat(AT_FDCWD, linkname, 0);
130
135
  err1:
131
136
  unlinkat(AT_FDCWD, target, 0);
132
137
  err:
133
138
  io_uring_queue_exit(&ring);
134
- return 1;
139
+ return T_EXIT_FAIL;
135
140
  }
136
-