polyphony 0.94 → 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 (306) 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/ext/polyphony/backend_common.c +3 -3
  9. data/ext/polyphony/backend_io_uring.c +18 -16
  10. data/ext/polyphony/event.c +1 -1
  11. data/ext/polyphony/extconf.rb +5 -3
  12. data/ext/polyphony/fiber.c +5 -13
  13. data/ext/polyphony/io_extensions.c +1 -1
  14. data/ext/polyphony/pipe.c +1 -1
  15. data/ext/polyphony/polyphony.c +1 -1
  16. data/ext/polyphony/polyphony_ext.c +1 -1
  17. data/ext/polyphony/queue.c +1 -1
  18. data/ext/polyphony/ring_buffer.c +1 -0
  19. data/ext/polyphony/socket_extensions.c +1 -1
  20. data/ext/polyphony/thread.c +1 -1
  21. data/lib/polyphony/extensions/enumerator.rb +16 -0
  22. data/lib/polyphony/extensions/socket.rb +2 -0
  23. data/lib/polyphony/extensions.rb +1 -0
  24. data/lib/polyphony/version.rb +1 -1
  25. data/polyphony.gemspec +2 -2
  26. data/test/test_backend.rb +5 -1
  27. data/test/test_enumerator.rb +46 -0
  28. data/test/test_io.rb +241 -216
  29. data/test/test_socket.rb +1 -1
  30. data/test/test_thread_pool.rb +3 -3
  31. data/vendor/liburing/.github/workflows/build.yml +51 -5
  32. data/vendor/liburing/.github/workflows/shellcheck.yml +1 -1
  33. data/vendor/liburing/.gitignore +6 -123
  34. data/vendor/liburing/CHANGELOG +35 -0
  35. data/vendor/liburing/CITATION.cff +11 -0
  36. data/vendor/liburing/LICENSE +16 -3
  37. data/vendor/liburing/Makefile +3 -1
  38. data/vendor/liburing/Makefile.common +1 -0
  39. data/vendor/liburing/README +14 -2
  40. data/vendor/liburing/SECURITY.md +6 -0
  41. data/vendor/liburing/configure +16 -15
  42. data/vendor/liburing/examples/Makefile +4 -1
  43. data/vendor/liburing/examples/io_uring-udp.c +395 -0
  44. data/vendor/liburing/examples/poll-bench.c +101 -0
  45. data/vendor/liburing/examples/send-zerocopy.c +339 -0
  46. data/vendor/liburing/liburing.spec +1 -1
  47. data/vendor/liburing/man/io_uring.7 +38 -11
  48. data/vendor/liburing/man/io_uring_buf_ring_add.3 +53 -0
  49. data/vendor/liburing/man/io_uring_buf_ring_advance.3 +31 -0
  50. data/vendor/liburing/man/io_uring_buf_ring_cq_advance.3 +41 -0
  51. data/vendor/liburing/man/io_uring_buf_ring_init.3 +30 -0
  52. data/vendor/liburing/man/io_uring_buf_ring_mask.3 +27 -0
  53. data/vendor/liburing/man/io_uring_cq_advance.3 +29 -15
  54. data/vendor/liburing/man/io_uring_cq_has_overflow.3 +25 -0
  55. data/vendor/liburing/man/io_uring_cq_ready.3 +9 -8
  56. data/vendor/liburing/man/io_uring_cqe_get_data.3 +32 -13
  57. data/vendor/liburing/man/io_uring_cqe_get_data64.3 +1 -0
  58. data/vendor/liburing/man/io_uring_cqe_seen.3 +22 -12
  59. data/vendor/liburing/man/io_uring_enter.2 +249 -32
  60. data/vendor/liburing/man/io_uring_enter2.2 +1 -0
  61. data/vendor/liburing/man/io_uring_free_probe.3 +11 -8
  62. data/vendor/liburing/man/io_uring_get_events.3 +33 -0
  63. data/vendor/liburing/man/io_uring_get_probe.3 +9 -8
  64. data/vendor/liburing/man/io_uring_get_sqe.3 +29 -10
  65. data/vendor/liburing/man/io_uring_opcode_supported.3 +11 -10
  66. data/vendor/liburing/man/io_uring_peek_cqe.3 +38 -0
  67. data/vendor/liburing/man/io_uring_prep_accept.3 +197 -0
  68. data/vendor/liburing/man/io_uring_prep_accept_direct.3 +1 -0
  69. data/vendor/liburing/man/io_uring_prep_cancel.3 +118 -0
  70. data/vendor/liburing/man/io_uring_prep_cancel64.3 +1 -0
  71. data/vendor/liburing/man/io_uring_prep_close.3 +59 -0
  72. data/vendor/liburing/man/io_uring_prep_close_direct.3 +1 -0
  73. data/vendor/liburing/man/io_uring_prep_connect.3 +66 -0
  74. data/vendor/liburing/man/io_uring_prep_fadvise.3 +59 -0
  75. data/vendor/liburing/man/io_uring_prep_fallocate.3 +59 -0
  76. data/vendor/liburing/man/io_uring_prep_files_update.3 +92 -0
  77. data/vendor/liburing/man/io_uring_prep_fsync.3 +70 -0
  78. data/vendor/liburing/man/io_uring_prep_link.3 +1 -0
  79. data/vendor/liburing/man/io_uring_prep_linkat.3 +91 -0
  80. data/vendor/liburing/man/io_uring_prep_madvise.3 +56 -0
  81. data/vendor/liburing/man/io_uring_prep_mkdir.3 +1 -0
  82. data/vendor/liburing/man/io_uring_prep_mkdirat.3 +83 -0
  83. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +39 -25
  84. data/vendor/liburing/man/io_uring_prep_multishot_accept.3 +1 -0
  85. data/vendor/liburing/man/io_uring_prep_multishot_accept_direct.3 +1 -0
  86. data/vendor/liburing/man/io_uring_prep_nop.3 +28 -0
  87. data/vendor/liburing/man/io_uring_prep_openat.3 +117 -0
  88. data/vendor/liburing/man/io_uring_prep_openat2.3 +117 -0
  89. data/vendor/liburing/man/io_uring_prep_openat2_direct.3 +1 -0
  90. data/vendor/liburing/man/io_uring_prep_openat_direct.3 +1 -0
  91. data/vendor/liburing/man/io_uring_prep_poll_add.3 +72 -0
  92. data/vendor/liburing/man/io_uring_prep_poll_multishot.3 +1 -0
  93. data/vendor/liburing/man/io_uring_prep_poll_remove.3 +55 -0
  94. data/vendor/liburing/man/io_uring_prep_poll_update.3 +89 -0
  95. data/vendor/liburing/man/io_uring_prep_provide_buffers.3 +131 -0
  96. data/vendor/liburing/man/io_uring_prep_read.3 +33 -14
  97. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +39 -21
  98. data/vendor/liburing/man/io_uring_prep_readv.3 +49 -15
  99. data/vendor/liburing/man/io_uring_prep_readv2.3 +49 -17
  100. data/vendor/liburing/man/io_uring_prep_recv.3 +105 -0
  101. data/vendor/liburing/man/io_uring_prep_recv_multishot.3 +1 -0
  102. data/vendor/liburing/man/io_uring_prep_recvmsg.3 +124 -0
  103. data/vendor/liburing/man/io_uring_prep_recvmsg_multishot.3 +1 -0
  104. data/vendor/liburing/man/io_uring_prep_remove_buffers.3 +52 -0
  105. data/vendor/liburing/man/io_uring_prep_rename.3 +1 -0
  106. data/vendor/liburing/man/io_uring_prep_renameat.3 +96 -0
  107. data/vendor/liburing/man/io_uring_prep_send.3 +57 -0
  108. data/vendor/liburing/man/io_uring_prep_send_zc.3 +64 -0
  109. data/vendor/liburing/man/io_uring_prep_sendmsg.3 +69 -0
  110. data/vendor/liburing/man/io_uring_prep_shutdown.3 +53 -0
  111. data/vendor/liburing/man/io_uring_prep_socket.3 +118 -0
  112. data/vendor/liburing/man/io_uring_prep_socket_direct.3 +1 -0
  113. data/vendor/liburing/man/io_uring_prep_socket_direct_alloc.3 +1 -0
  114. data/vendor/liburing/man/io_uring_prep_splice.3 +80 -0
  115. data/vendor/liburing/man/io_uring_prep_statx.3 +74 -0
  116. data/vendor/liburing/man/io_uring_prep_symlink.3 +1 -0
  117. data/vendor/liburing/man/io_uring_prep_symlinkat.3 +85 -0
  118. data/vendor/liburing/man/io_uring_prep_sync_file_range.3 +59 -0
  119. data/vendor/liburing/man/io_uring_prep_tee.3 +74 -0
  120. data/vendor/liburing/man/io_uring_prep_timeout.3 +95 -0
  121. data/vendor/liburing/man/io_uring_prep_timeout_remove.3 +1 -0
  122. data/vendor/liburing/man/io_uring_prep_timeout_update.3 +98 -0
  123. data/vendor/liburing/man/io_uring_prep_unlink.3 +1 -0
  124. data/vendor/liburing/man/io_uring_prep_unlinkat.3 +82 -0
  125. data/vendor/liburing/man/io_uring_prep_write.3 +32 -15
  126. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +39 -21
  127. data/vendor/liburing/man/io_uring_prep_writev.3 +50 -16
  128. data/vendor/liburing/man/io_uring_prep_writev2.3 +50 -17
  129. data/vendor/liburing/man/io_uring_queue_exit.3 +3 -4
  130. data/vendor/liburing/man/io_uring_queue_init.3 +58 -13
  131. data/vendor/liburing/man/io_uring_queue_init_params.3 +1 -0
  132. data/vendor/liburing/man/io_uring_recvmsg_cmsg_firsthdr.3 +1 -0
  133. data/vendor/liburing/man/io_uring_recvmsg_cmsg_nexthdr.3 +1 -0
  134. data/vendor/liburing/man/io_uring_recvmsg_name.3 +1 -0
  135. data/vendor/liburing/man/io_uring_recvmsg_out.3 +78 -0
  136. data/vendor/liburing/man/io_uring_recvmsg_payload.3 +1 -0
  137. data/vendor/liburing/man/io_uring_recvmsg_payload_length.3 +1 -0
  138. data/vendor/liburing/man/io_uring_recvmsg_validate.3 +1 -0
  139. data/vendor/liburing/man/io_uring_register.2 +153 -13
  140. data/vendor/liburing/man/io_uring_register_buf_ring.3 +140 -0
  141. data/vendor/liburing/man/io_uring_register_buffers.3 +32 -12
  142. data/vendor/liburing/man/io_uring_register_eventfd.3 +51 -0
  143. data/vendor/liburing/man/io_uring_register_eventfd_async.3 +1 -0
  144. data/vendor/liburing/man/io_uring_register_file_alloc_range.3 +52 -0
  145. data/vendor/liburing/man/io_uring_register_files.3 +33 -11
  146. data/vendor/liburing/man/io_uring_register_files_sparse.3 +1 -0
  147. data/vendor/liburing/man/io_uring_register_iowq_aff.3 +61 -0
  148. data/vendor/liburing/man/io_uring_register_iowq_max_workers.3 +71 -0
  149. data/vendor/liburing/man/io_uring_register_ring_fd.3 +49 -0
  150. data/vendor/liburing/man/io_uring_register_sync_cancel.3 +71 -0
  151. data/vendor/liburing/man/io_uring_setup.2 +119 -13
  152. data/vendor/liburing/man/io_uring_sq_ready.3 +14 -8
  153. data/vendor/liburing/man/io_uring_sq_space_left.3 +9 -9
  154. data/vendor/liburing/man/io_uring_sqe_set_data.3 +29 -11
  155. data/vendor/liburing/man/io_uring_sqe_set_data64.3 +1 -0
  156. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +38 -11
  157. data/vendor/liburing/man/io_uring_sqring_wait.3 +13 -9
  158. data/vendor/liburing/man/io_uring_submit.3 +29 -12
  159. data/vendor/liburing/man/io_uring_submit_and_get_events.3 +31 -0
  160. data/vendor/liburing/man/io_uring_submit_and_wait.3 +16 -12
  161. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +30 -23
  162. data/vendor/liburing/man/io_uring_unregister_buf_ring.3 +30 -0
  163. data/vendor/liburing/man/io_uring_unregister_buffers.3 +11 -10
  164. data/vendor/liburing/man/io_uring_unregister_eventfd.3 +1 -0
  165. data/vendor/liburing/man/io_uring_unregister_files.3 +11 -10
  166. data/vendor/liburing/man/io_uring_unregister_iowq_aff.3 +1 -0
  167. data/vendor/liburing/man/io_uring_unregister_ring_fd.3 +32 -0
  168. data/vendor/liburing/man/io_uring_wait_cqe.3 +19 -12
  169. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +21 -14
  170. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +27 -13
  171. data/vendor/liburing/man/io_uring_wait_cqes.3 +24 -14
  172. data/vendor/liburing/src/Makefile +8 -7
  173. data/vendor/liburing/src/arch/aarch64/lib.h +48 -0
  174. data/vendor/liburing/src/arch/aarch64/syscall.h +0 -4
  175. data/vendor/liburing/src/arch/generic/lib.h +0 -4
  176. data/vendor/liburing/src/arch/generic/syscall.h +29 -16
  177. data/vendor/liburing/src/arch/syscall-defs.h +41 -14
  178. data/vendor/liburing/src/arch/x86/lib.h +0 -21
  179. data/vendor/liburing/src/arch/x86/syscall.h +146 -10
  180. data/vendor/liburing/src/include/liburing/io_uring.h +245 -5
  181. data/vendor/liburing/src/include/liburing.h +468 -35
  182. data/vendor/liburing/src/int_flags.h +1 -0
  183. data/vendor/liburing/src/lib.h +20 -16
  184. data/vendor/liburing/src/liburing.map +16 -0
  185. data/vendor/liburing/src/nolibc.c +1 -1
  186. data/vendor/liburing/src/queue.c +87 -55
  187. data/vendor/liburing/src/register.c +129 -53
  188. data/vendor/liburing/src/setup.c +65 -28
  189. data/vendor/liburing/src/syscall.c +14 -32
  190. data/vendor/liburing/src/syscall.h +12 -64
  191. data/vendor/liburing/test/{232c93d07b74-test.c → 232c93d07b74.c} +8 -9
  192. data/vendor/liburing/test/{35fa71a030ca-test.c → 35fa71a030ca.c} +4 -4
  193. data/vendor/liburing/test/{500f9fbadef8-test.c → 500f9fbadef8.c} +7 -7
  194. data/vendor/liburing/test/{7ad0e4b2f83c-test.c → 7ad0e4b2f83c.c} +8 -7
  195. data/vendor/liburing/test/{8a9973408177-test.c → 8a9973408177.c} +4 -3
  196. data/vendor/liburing/test/{917257daa0fe-test.c → 917257daa0fe.c} +3 -2
  197. data/vendor/liburing/test/Makefile +60 -62
  198. data/vendor/liburing/test/{a0908ae19763-test.c → a0908ae19763.c} +3 -2
  199. data/vendor/liburing/test/{a4c0b3decb33-test.c → a4c0b3decb33.c} +3 -2
  200. data/vendor/liburing/test/accept-link.c +5 -4
  201. data/vendor/liburing/test/accept-reuse.c +17 -16
  202. data/vendor/liburing/test/accept-test.c +14 -10
  203. data/vendor/liburing/test/accept.c +529 -107
  204. data/vendor/liburing/test/across-fork.c +7 -6
  205. data/vendor/liburing/test/{b19062a56726-test.c → b19062a56726.c} +3 -2
  206. data/vendor/liburing/test/{b5837bd5311d-test.c → b5837bd5311d.c} +10 -9
  207. data/vendor/liburing/test/buf-ring.c +420 -0
  208. data/vendor/liburing/test/{ce593a6c480a-test.c → ce593a6c480a.c} +15 -12
  209. data/vendor/liburing/test/connect.c +8 -7
  210. data/vendor/liburing/test/cq-full.c +5 -4
  211. data/vendor/liburing/test/cq-overflow.c +242 -12
  212. data/vendor/liburing/test/cq-peek-batch.c +5 -4
  213. data/vendor/liburing/test/cq-ready.c +5 -4
  214. data/vendor/liburing/test/cq-size.c +5 -4
  215. data/vendor/liburing/test/{d4ae271dfaae-test.c → d4ae271dfaae.c} +2 -2
  216. data/vendor/liburing/test/{d77a67ed5f27-test.c → d77a67ed5f27.c} +6 -6
  217. data/vendor/liburing/test/defer-taskrun.c +336 -0
  218. data/vendor/liburing/test/defer.c +26 -14
  219. data/vendor/liburing/test/double-poll-crash.c +15 -5
  220. data/vendor/liburing/test/drop-submit.c +5 -3
  221. data/vendor/liburing/test/{eeed8b54e0df-test.c → eeed8b54e0df.c} +7 -6
  222. data/vendor/liburing/test/empty-eownerdead.c +4 -4
  223. data/vendor/liburing/test/eventfd-disable.c +48 -20
  224. data/vendor/liburing/test/eventfd-reg.c +10 -9
  225. data/vendor/liburing/test/eventfd-ring.c +13 -12
  226. data/vendor/liburing/test/eventfd.c +13 -12
  227. data/vendor/liburing/test/exit-no-cleanup.c +1 -1
  228. data/vendor/liburing/test/fadvise.c +3 -3
  229. data/vendor/liburing/test/fallocate.c +16 -9
  230. data/vendor/liburing/test/{fc2a85cb02ef-test.c → fc2a85cb02ef.c} +4 -3
  231. data/vendor/liburing/test/fd-pass.c +187 -0
  232. data/vendor/liburing/test/file-register.c +302 -36
  233. data/vendor/liburing/test/file-update.c +62 -4
  234. data/vendor/liburing/test/file-verify.c +6 -2
  235. data/vendor/liburing/test/files-exit-hang-poll.c +11 -25
  236. data/vendor/liburing/test/files-exit-hang-timeout.c +13 -10
  237. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  238. data/vendor/liburing/test/fixed-link.c +10 -10
  239. data/vendor/liburing/test/fixed-reuse.c +160 -0
  240. data/vendor/liburing/test/fpos.c +6 -3
  241. data/vendor/liburing/test/fsync.c +3 -3
  242. data/vendor/liburing/test/hardlink.c +10 -6
  243. data/vendor/liburing/test/helpers.c +137 -4
  244. data/vendor/liburing/test/helpers.h +27 -0
  245. data/vendor/liburing/test/io-cancel.c +16 -11
  246. data/vendor/liburing/test/io_uring_enter.c +46 -81
  247. data/vendor/liburing/test/io_uring_passthrough.c +451 -0
  248. data/vendor/liburing/test/io_uring_register.c +59 -229
  249. data/vendor/liburing/test/io_uring_setup.c +24 -29
  250. data/vendor/liburing/test/iopoll-leak.c +85 -0
  251. data/vendor/liburing/test/iopoll.c +16 -9
  252. data/vendor/liburing/test/lfs-openat-write.c +3 -1
  253. data/vendor/liburing/test/link-timeout.c +4 -3
  254. data/vendor/liburing/test/link.c +8 -7
  255. data/vendor/liburing/test/madvise.c +2 -2
  256. data/vendor/liburing/test/mkdir.c +9 -5
  257. data/vendor/liburing/test/msg-ring.c +46 -20
  258. data/vendor/liburing/test/multicqes_drain.c +51 -12
  259. data/vendor/liburing/test/nolibc.c +60 -0
  260. data/vendor/liburing/test/nop.c +78 -16
  261. data/vendor/liburing/test/nvme.h +168 -0
  262. data/vendor/liburing/test/open-direct-link.c +188 -0
  263. data/vendor/liburing/test/open-direct-pick.c +180 -0
  264. data/vendor/liburing/test/openat2.c +3 -3
  265. data/vendor/liburing/test/poll-cancel-all.c +472 -0
  266. data/vendor/liburing/test/poll-link.c +9 -18
  267. data/vendor/liburing/test/poll-mshot-overflow.c +162 -0
  268. data/vendor/liburing/test/poll-mshot-update.c +83 -33
  269. data/vendor/liburing/test/pollfree.c +2 -2
  270. data/vendor/liburing/test/read-before-exit.c +112 -0
  271. data/vendor/liburing/test/read-write.c +83 -1
  272. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  273. data/vendor/liburing/test/recv-msgall.c +265 -0
  274. data/vendor/liburing/test/recv-multishot.c +505 -0
  275. data/vendor/liburing/test/rename.c +2 -5
  276. data/vendor/liburing/test/ring-leak.c +97 -0
  277. data/vendor/liburing/test/ringbuf-read.c +200 -0
  278. data/vendor/liburing/test/rsrc_tags.c +25 -13
  279. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  280. data/vendor/liburing/test/runtests.sh +18 -20
  281. data/vendor/liburing/test/rw_merge_test.c +3 -2
  282. data/vendor/liburing/test/send-zerocopy.c +684 -0
  283. data/vendor/liburing/test/send_recv.c +49 -2
  284. data/vendor/liburing/test/send_recvmsg.c +165 -55
  285. data/vendor/liburing/test/shutdown.c +3 -4
  286. data/vendor/liburing/test/sigfd-deadlock.c +22 -8
  287. data/vendor/liburing/test/single-issuer.c +171 -0
  288. data/vendor/liburing/test/socket-rw-eagain.c +2 -12
  289. data/vendor/liburing/test/socket-rw-offset.c +2 -11
  290. data/vendor/liburing/test/socket-rw.c +2 -11
  291. data/vendor/liburing/test/socket.c +409 -0
  292. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  293. data/vendor/liburing/test/sq-poll-share.c +1 -1
  294. data/vendor/liburing/test/statx.c +2 -2
  295. data/vendor/liburing/test/submit-and-wait.c +108 -0
  296. data/vendor/liburing/test/submit-link-fail.c +5 -3
  297. data/vendor/liburing/test/submit-reuse.c +0 -2
  298. data/vendor/liburing/test/sync-cancel.c +235 -0
  299. data/vendor/liburing/test/test.h +35 -0
  300. data/vendor/liburing/test/timeout-overflow.c +11 -11
  301. data/vendor/liburing/test/timeout.c +7 -7
  302. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  303. data/vendor/liburing/test/unlink.c +1 -1
  304. data/vendor/liburing/test/xattr.c +425 -0
  305. metadata +143 -22
  306. data/Gemfile.lock +0 -78
@@ -19,7 +19,7 @@ static char str[] = "This is a test of send and recv over io_uring!";
19
19
 
20
20
  #define MAX_MSG 128
21
21
 
22
- #define PORT 10200
22
+ #define PORT 10202
23
23
  #define HOST "127.0.0.1"
24
24
 
25
25
  static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock,
@@ -254,7 +254,48 @@ static int test(int use_sqthread, int regfiles)
254
254
  pthread_mutex_lock(&rd.mutex);
255
255
  do_send();
256
256
  pthread_join(recv_thread, &retval);
257
- return (int)(intptr_t)retval;
257
+ return (intptr_t)retval;
258
+ }
259
+
260
+ static int test_invalid(void)
261
+ {
262
+ struct io_uring ring;
263
+ int ret, i;
264
+ int fds[2];
265
+ struct io_uring_cqe *cqe;
266
+ struct io_uring_sqe *sqe;
267
+
268
+ ret = t_create_ring(8, &ring, 0);
269
+ if (ret)
270
+ return ret;
271
+
272
+ ret = t_create_socket_pair(fds, true);
273
+ if (ret)
274
+ return ret;
275
+
276
+ sqe = io_uring_get_sqe(&ring);
277
+ io_uring_prep_sendmsg(sqe, fds[0], NULL, MSG_WAITALL);
278
+ sqe->flags |= IOSQE_ASYNC;
279
+
280
+ sqe = io_uring_get_sqe(&ring);
281
+ io_uring_prep_recvmsg(sqe, fds[1], NULL, 0);
282
+ sqe->flags |= IOSQE_ASYNC;
283
+
284
+ ret = io_uring_submit_and_wait(&ring, 2);
285
+ if (ret != 2)
286
+ return ret;
287
+
288
+ for (i = 0; i < 2; i++) {
289
+ ret = io_uring_peek_cqe(&ring, &cqe);
290
+ if (ret || cqe->res != -EFAULT)
291
+ return -1;
292
+ io_uring_cqe_seen(&ring, cqe);
293
+ }
294
+
295
+ io_uring_queue_exit(&ring);
296
+ close(fds[0]);
297
+ close(fds[1]);
298
+ return 0;
258
299
  }
259
300
 
260
301
  int main(int argc, char *argv[])
@@ -264,6 +305,12 @@ int main(int argc, char *argv[])
264
305
  if (argc > 1)
265
306
  return 0;
266
307
 
308
+ ret = test_invalid();
309
+ if (ret) {
310
+ fprintf(stderr, "test_invalid failed\n");
311
+ return ret;
312
+ }
313
+
267
314
  ret = test(0, 0);
268
315
  if (ret) {
269
316
  fprintf(stderr, "test sqthread=0 failed\n");
@@ -17,9 +17,11 @@
17
17
 
18
18
  static char str[] = "This is a test of sendmsg and recvmsg over io_uring!";
19
19
 
20
+ static int ud;
21
+
20
22
  #define MAX_MSG 128
21
23
 
22
- #define PORT 10200
24
+ #define PORT 10203
23
25
  #define HOST "127.0.0.1"
24
26
 
25
27
  #define BUF_BGID 10
@@ -27,31 +29,32 @@ static char str[] = "This is a test of sendmsg and recvmsg over io_uring!";
27
29
 
28
30
  #define MAX_IOV_COUNT 10
29
31
 
30
- static int recv_prep(struct io_uring *ring, struct iovec iov[], int iov_count,
31
- int bgid)
32
+ static int no_pbuf_ring;
33
+
34
+ static int recv_prep(struct io_uring *ring, int *sockfd, struct iovec iov[],
35
+ int iov_count, int bgid, int async)
32
36
  {
33
37
  struct sockaddr_in saddr;
34
38
  struct msghdr msg;
35
39
  struct io_uring_sqe *sqe;
36
- int sockfd, ret;
37
- int val = 1;
40
+ int ret, val = 1;
38
41
 
39
42
  memset(&saddr, 0, sizeof(saddr));
40
43
  saddr.sin_family = AF_INET;
41
44
  saddr.sin_addr.s_addr = htonl(INADDR_ANY);
42
45
  saddr.sin_port = htons(PORT);
43
46
 
44
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
45
- if (sockfd < 0) {
47
+ *sockfd = socket(AF_INET, SOCK_DGRAM, 0);
48
+ if (*sockfd < 0) {
46
49
  perror("socket");
47
50
  return 1;
48
51
  }
49
52
 
50
53
  val = 1;
51
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
52
- setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
54
+ setsockopt(*sockfd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
55
+ setsockopt(*sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
53
56
 
54
- ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
57
+ ret = bind(*sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
55
58
  if (ret < 0) {
56
59
  perror("bind");
57
60
  goto err;
@@ -63,13 +66,16 @@ static int recv_prep(struct io_uring *ring, struct iovec iov[], int iov_count,
63
66
  return 1;
64
67
  }
65
68
 
66
- io_uring_prep_recvmsg(sqe, sockfd, &msg, 0);
69
+ io_uring_prep_recvmsg(sqe, *sockfd, &msg, 0);
67
70
  if (bgid) {
68
71
  iov->iov_base = NULL;
69
72
  sqe->flags |= IOSQE_BUFFER_SELECT;
70
73
  sqe->buf_group = bgid;
71
74
  iov_count = 1;
72
75
  }
76
+ sqe->user_data = ++ud;
77
+ if (async)
78
+ sqe->flags |= IOSQE_ASYNC;
73
79
  memset(&msg, 0, sizeof(msg));
74
80
  msg.msg_namelen = sizeof(struct sockaddr_in);
75
81
  msg.msg_iov = iov;
@@ -81,18 +87,19 @@ static int recv_prep(struct io_uring *ring, struct iovec iov[], int iov_count,
81
87
  goto err;
82
88
  }
83
89
 
84
- close(sockfd);
85
90
  return 0;
86
91
  err:
87
- close(sockfd);
92
+ close(*sockfd);
88
93
  return 1;
89
94
  }
90
95
 
91
96
  struct recv_data {
92
97
  pthread_mutex_t *mutex;
93
98
  int buf_select;
99
+ int buf_ring;
94
100
  int no_buf_add;
95
101
  int iov_count;
102
+ int async;
96
103
  };
97
104
 
98
105
  static int do_recvmsg(struct io_uring *ring, char buf[MAX_MSG + 1],
@@ -107,18 +114,18 @@ static int do_recvmsg(struct io_uring *ring, char buf[MAX_MSG + 1],
107
114
  goto err;
108
115
  }
109
116
  if (cqe->res < 0) {
110
- if (rd->no_buf_add && rd->buf_select)
117
+ if (rd->no_buf_add && (rd->buf_select || rd->buf_ring))
111
118
  return 0;
112
119
  fprintf(stderr, "%s: failed cqe: %d\n", __FUNCTION__, cqe->res);
113
120
  goto err;
114
121
  }
115
- if (cqe->flags) {
122
+ if (cqe->flags & IORING_CQE_F_BUFFER) {
116
123
  int bid = cqe->flags >> 16;
117
124
  if (bid != BUF_BID)
118
125
  fprintf(stderr, "Buffer ID mismatch %d\n", bid);
119
126
  }
120
127
 
121
- if (rd->no_buf_add && rd->buf_select) {
128
+ if (rd->no_buf_add && (rd->buf_ring || rd->buf_select)) {
122
129
  fprintf(stderr, "Expected -ENOBUFS: %d\n", cqe->res);
123
130
  goto err;
124
131
  }
@@ -158,12 +165,14 @@ static void *recv_fn(void *data)
158
165
  {
159
166
  struct recv_data *rd = data;
160
167
  pthread_mutex_t *mutex = rd->mutex;
168
+ struct io_uring_buf_ring *br = NULL;
161
169
  char buf[MAX_MSG + 1];
162
170
  struct iovec iov[MAX_IOV_COUNT];
163
- struct io_uring_sqe *sqe;
164
- struct io_uring_cqe *cqe;
165
171
  struct io_uring ring;
166
- int ret;
172
+ int ret, sockfd;
173
+
174
+ if (rd->buf_ring && no_pbuf_ring)
175
+ goto out_no_ring;
167
176
 
168
177
  init_iov(iov, rd->iov_count, buf);
169
178
 
@@ -173,34 +182,61 @@ static void *recv_fn(void *data)
173
182
  goto err;
174
183
  }
175
184
 
176
- if (rd->buf_select && !rd->no_buf_add) {
177
- sqe = io_uring_get_sqe(&ring);
178
- io_uring_prep_provide_buffers(sqe, buf, sizeof(buf) -1, 1,
179
- BUF_BGID, BUF_BID);
180
- ret = io_uring_submit(&ring);
181
- if (ret != 1) {
182
- fprintf(stderr, "submit ret=%d\n", ret);
183
- goto err;
184
- }
185
-
186
- ret = io_uring_wait_cqe(&ring, &cqe);
187
- if (ret) {
188
- fprintf(stderr, "wait_cqe=%d\n", ret);
189
- goto err;
190
- }
191
- ret = cqe->res;
192
- io_uring_cqe_seen(&ring, cqe);
193
- if (ret == -EINVAL) {
194
- fprintf(stdout, "PROVIDE_BUFFERS not supported, skip\n");
195
- goto out;
196
- goto err;
197
- } else if (ret < 0) {
198
- fprintf(stderr, "PROVIDER_BUFFERS %d\n", ret);
199
- goto err;
185
+ if ((rd->buf_ring || rd->buf_select) && !rd->no_buf_add) {
186
+ if (rd->buf_ring) {
187
+ struct io_uring_buf_reg reg = { };
188
+ void *ptr;
189
+
190
+ if (posix_memalign(&ptr, 4096, 4096))
191
+ goto err;
192
+
193
+ reg.ring_addr = (unsigned long) ptr;
194
+ reg.ring_entries = 1;
195
+ reg.bgid = BUF_BGID;
196
+ if (io_uring_register_buf_ring(&ring, &reg, 0)) {
197
+ no_pbuf_ring = 1;
198
+ goto out;
199
+ }
200
+
201
+ br = ptr;
202
+ io_uring_buf_ring_init(br);
203
+ io_uring_buf_ring_add(br, buf, sizeof(buf), BUF_BID,
204
+ io_uring_buf_ring_mask(1), 0);
205
+ io_uring_buf_ring_advance(br, 1);
206
+ } else {
207
+ struct io_uring_sqe *sqe;
208
+ struct io_uring_cqe *cqe;
209
+
210
+ sqe = io_uring_get_sqe(&ring);
211
+ io_uring_prep_provide_buffers(sqe, buf, sizeof(buf) -1,
212
+ 1, BUF_BGID, BUF_BID);
213
+ sqe->user_data = ++ud;
214
+ ret = io_uring_submit(&ring);
215
+ if (ret != 1) {
216
+ fprintf(stderr, "submit ret=%d\n", ret);
217
+ goto err;
218
+ }
219
+
220
+ ret = io_uring_wait_cqe(&ring, &cqe);
221
+ if (ret) {
222
+ fprintf(stderr, "wait_cqe=%d\n", ret);
223
+ goto err;
224
+ }
225
+ ret = cqe->res;
226
+ io_uring_cqe_seen(&ring, cqe);
227
+ if (ret == -EINVAL) {
228
+ fprintf(stdout, "PROVIDE_BUFFERS not supported, skip\n");
229
+ goto out;
230
+ } else if (ret < 0) {
231
+ fprintf(stderr, "PROVIDER_BUFFERS %d\n", ret);
232
+ goto err;
233
+ }
200
234
  }
201
235
  }
202
236
 
203
- ret = recv_prep(&ring, iov, rd->iov_count, rd->buf_select ? BUF_BGID : 0);
237
+ ret = recv_prep(&ring, &sockfd, iov, rd->iov_count,
238
+ (rd->buf_ring || rd->buf_select) ? BUF_BGID : 0,
239
+ rd->async);
204
240
  if (ret) {
205
241
  fprintf(stderr, "recv_prep failed: %d\n", ret);
206
242
  goto err;
@@ -208,14 +244,19 @@ static void *recv_fn(void *data)
208
244
 
209
245
  pthread_mutex_unlock(mutex);
210
246
  ret = do_recvmsg(&ring, buf, rd);
247
+ close(sockfd);
211
248
 
212
249
  io_uring_queue_exit(&ring);
213
-
250
+ if (br)
251
+ free(br);
214
252
  err:
215
253
  return (void *)(intptr_t)ret;
216
254
  out:
217
- pthread_mutex_unlock(mutex);
218
255
  io_uring_queue_exit(&ring);
256
+ out_no_ring:
257
+ pthread_mutex_unlock(mutex);
258
+ if (br)
259
+ free(br);
219
260
  return NULL;
220
261
  }
221
262
 
@@ -255,8 +296,11 @@ static int do_sendmsg(void)
255
296
  return 1;
256
297
  }
257
298
 
299
+ usleep(10000);
300
+
258
301
  sqe = io_uring_get_sqe(&ring);
259
302
  io_uring_prep_sendmsg(sqe, sockfd, &msg, 0);
303
+ sqe->user_data = ++ud;
260
304
 
261
305
  ret = io_uring_submit(&ring);
262
306
  if (ret <= 0) {
@@ -277,7 +321,8 @@ err:
277
321
  return 1;
278
322
  }
279
323
 
280
- static int test(int buf_select, int no_buf_add, int iov_count)
324
+ static int test(int buf_select, int buf_ring, int no_buf_add, int iov_count,
325
+ int async)
281
326
  {
282
327
  struct recv_data rd;
283
328
  pthread_mutexattr_t attr;
@@ -286,6 +331,9 @@ static int test(int buf_select, int no_buf_add, int iov_count)
286
331
  int ret;
287
332
  void *retval;
288
333
 
334
+ if (buf_select || buf_ring)
335
+ assert(iov_count == 1);
336
+
289
337
  pthread_mutexattr_init(&attr);
290
338
  pthread_mutexattr_setpshared(&attr, 1);
291
339
  pthread_mutex_init(&mutex, &attr);
@@ -293,8 +341,10 @@ static int test(int buf_select, int no_buf_add, int iov_count)
293
341
 
294
342
  rd.mutex = &mutex;
295
343
  rd.buf_select = buf_select;
344
+ rd.buf_ring = buf_ring;
296
345
  rd.no_buf_add = no_buf_add;
297
346
  rd.iov_count = iov_count;
347
+ rd.async = async;
298
348
  ret = pthread_create(&recv_thread, NULL, recv_fn, &rd);
299
349
  if (ret) {
300
350
  pthread_mutex_unlock(&mutex);
@@ -305,7 +355,7 @@ static int test(int buf_select, int no_buf_add, int iov_count)
305
355
  pthread_mutex_lock(&mutex);
306
356
  do_sendmsg();
307
357
  pthread_join(recv_thread, &retval);
308
- ret = (int)(intptr_t)retval;
358
+ ret = (intptr_t)retval;
309
359
 
310
360
  return ret;
311
361
  }
@@ -317,27 +367,87 @@ int main(int argc, char *argv[])
317
367
  if (argc > 1)
318
368
  return 0;
319
369
 
320
- ret = test(0, 0, 1);
370
+ ret = test(0, 0, 0, 1, 0);
321
371
  if (ret) {
322
- fprintf(stderr, "send_recvmsg 0 failed\n");
372
+ fprintf(stderr, "send_recvmsg 0 0 0 1 0 failed\n");
323
373
  return 1;
324
374
  }
325
375
 
326
- ret = test(0, 0, 10);
376
+ ret = test(0, 0, 0, 10, 0);
327
377
  if (ret) {
328
378
  fprintf(stderr, "send_recvmsg multi iov failed\n");
329
379
  return 1;
330
380
  }
331
381
 
332
- ret = test(1, 0, 1);
382
+ ret = test(1, 0, 0, 1, 0);
383
+ if (ret) {
384
+ fprintf(stderr, "send_recvmsg 1 0 0 1 0 failed\n");
385
+ return 1;
386
+ }
387
+
388
+ ret = test(1, 0, 1, 1, 0);
389
+ if (ret) {
390
+ fprintf(stderr, "send_recvmsg 1 0 1 1 0 failed\n");
391
+ return 1;
392
+ }
393
+
394
+ ret = test(0, 1, 0, 1, 0);
395
+ if (ret) {
396
+ fprintf(stderr, "send_recvmsg 0 1 0 1 0 failed\n");
397
+ return 1;
398
+ }
399
+
400
+ ret = test(1, 1, 0, 1, 0);
401
+ if (ret) {
402
+ fprintf(stderr, "send_recvmsg 1 1 0 1 0 failed\n");
403
+ return 1;
404
+ }
405
+
406
+ ret = test(1, 1, 1, 1, 0);
407
+ if (ret) {
408
+ fprintf(stderr, "send_recvmsg 1 1 1 1 0 failed\n");
409
+ return 1;
410
+ }
411
+
412
+ ret = test(0, 0, 0, 1, 1);
413
+ if (ret) {
414
+ fprintf(stderr, "send_recvmsg async 0 0 0 1 1 failed\n");
415
+ return 1;
416
+ }
417
+
418
+ ret = test(0, 0, 0, 10, 1);
419
+ if (ret) {
420
+ fprintf(stderr, "send_recvmsg async multi iov failed\n");
421
+ return 1;
422
+ }
423
+
424
+ ret = test(1, 0, 0, 1, 1);
425
+ if (ret) {
426
+ fprintf(stderr, "send_recvmsg async 1 0 0 1 1 failed\n");
427
+ return 1;
428
+ }
429
+
430
+ ret = test(1, 0, 1, 1, 1);
431
+ if (ret) {
432
+ fprintf(stderr, "send_recvmsg async 1 0 1 1 1 failed\n");
433
+ return 1;
434
+ }
435
+
436
+ ret = test(0, 1, 0, 1, 1);
437
+ if (ret) {
438
+ fprintf(stderr, "send_recvmsg async 0 1 0 1 1 failed\n");
439
+ return 1;
440
+ }
441
+
442
+ ret = test(1, 1, 0, 1, 1);
333
443
  if (ret) {
334
- fprintf(stderr, "send_recvmsg 1 0 failed\n");
444
+ fprintf(stderr, "send_recvmsg async 1 1 0 1 1 failed\n");
335
445
  return 1;
336
446
  }
337
447
 
338
- ret = test(1, 1, 1);
448
+ ret = test(1, 1, 1, 1, 1);
339
449
  if (ret) {
340
- fprintf(stderr, "send_recvmsg 1 1 failed\n");
450
+ fprintf(stderr, "send_recvmsg async 1 1 1 1 1 failed\n");
341
451
  return 1;
342
452
  }
343
453
 
@@ -19,6 +19,7 @@
19
19
  #include <arpa/inet.h>
20
20
 
21
21
  #include "liburing.h"
22
+ #include "helpers.h"
22
23
 
23
24
  static void sig_pipe(int sig)
24
25
  {
@@ -29,7 +30,7 @@ int main(int argc, char *argv[])
29
30
  int p_fd[2], ret;
30
31
  int32_t recv_s0;
31
32
  int32_t val = 1;
32
- struct sockaddr_in addr;
33
+ struct sockaddr_in addr = { };
33
34
 
34
35
  if (argc > 1)
35
36
  return 0;
@@ -44,11 +45,9 @@ int main(int argc, char *argv[])
44
45
  assert(ret != -1);
45
46
 
46
47
  addr.sin_family = AF_INET;
47
- addr.sin_port = htons((rand() % 61440) + 4096);
48
48
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
49
49
 
50
- ret = bind(recv_s0, (struct sockaddr*)&addr, sizeof(addr));
51
- assert(ret != -1);
50
+ assert(!t_bind_ephemeral_port(recv_s0, &addr));
52
51
  ret = listen(recv_s0, 128);
53
52
  assert(ret != -1);
54
53
 
@@ -11,6 +11,7 @@
11
11
  #include <poll.h>
12
12
  #include <stdio.h>
13
13
  #include "liburing.h"
14
+ #include "helpers.h"
14
15
 
15
16
  static int setup_signal(void)
16
17
  {
@@ -34,22 +35,35 @@ static int test_uring(int sfd)
34
35
  struct io_uring ring;
35
36
  int ret;
36
37
 
37
- io_uring_queue_init(32, &ring, 0);
38
+ ret = io_uring_queue_init(32, &ring, 0);
39
+ if (ret)
40
+ return T_EXIT_FAIL;
38
41
 
39
42
  sqe = io_uring_get_sqe(&ring);
40
43
  io_uring_prep_poll_add(sqe, sfd, POLLIN);
41
- io_uring_submit(&ring);
44
+ ret = io_uring_submit(&ring);
45
+ if (ret < 0) {
46
+ ret = T_EXIT_FAIL;
47
+ goto err_exit;
48
+ }
42
49
 
43
50
  kill(getpid(), SIGINT);
44
51
 
45
52
  io_uring_wait_cqe(&ring, &cqe);
46
- if (cqe->res & POLLIN) {
47
- ret = 0;
53
+ if (cqe->res == -EOPNOTSUPP) {
54
+ fprintf(stderr, "signalfd poll not supported\n");
55
+ ret = T_EXIT_SKIP;
56
+ } else if (cqe->res < 0) {
57
+ fprintf(stderr, "poll failed: %d\n", cqe->res);
58
+ ret = T_EXIT_FAIL;
59
+ } else if (cqe->res & POLLIN) {
60
+ ret = T_EXIT_PASS;
48
61
  } else {
49
62
  fprintf(stderr, "Unexpected poll mask %x\n", cqe->res);
50
- ret = 1;
63
+ ret = T_EXIT_FAIL;
51
64
  }
52
65
  io_uring_cqe_seen(&ring, cqe);
66
+ err_exit:
53
67
  io_uring_queue_exit(&ring);
54
68
  return ret;
55
69
  }
@@ -59,14 +73,14 @@ int main(int argc, char *argv[])
59
73
  int sfd, ret;
60
74
 
61
75
  if (argc > 1)
62
- return 0;
76
+ return T_EXIT_PASS;
63
77
 
64
78
  sfd = setup_signal();
65
79
  if (sfd < 0)
66
- return 1;
80
+ return T_EXIT_FAIL;
67
81
 
68
82
  ret = test_uring(sfd);
69
- if (ret)
83
+ if (ret == T_EXIT_FAIL)
70
84
  fprintf(stderr, "test_uring signalfd failed\n");
71
85
 
72
86
  close(sfd);