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
@@ -0,0 +1,108 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: Test that io_uring_submit_and_wait_timeout() returns the
4
+ * right value (submit count) and that it doesn't end up waiting twice.
5
+ *
6
+ */
7
+ #include <errno.h>
8
+ #include <stdio.h>
9
+ #include <unistd.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+ #include <fcntl.h>
13
+ #include <sys/time.h>
14
+
15
+ #include "liburing.h"
16
+ #include "test.h"
17
+
18
+ static unsigned long long mtime_since(const struct timeval *s,
19
+ const struct timeval *e)
20
+ {
21
+ long long sec, usec;
22
+
23
+ sec = e->tv_sec - s->tv_sec;
24
+ usec = (e->tv_usec - s->tv_usec);
25
+ if (sec > 0 && usec < 0) {
26
+ sec--;
27
+ usec += 1000000;
28
+ }
29
+
30
+ sec *= 1000;
31
+ usec /= 1000;
32
+ return sec + usec;
33
+ }
34
+
35
+ static unsigned long long mtime_since_now(struct timeval *tv)
36
+ {
37
+ struct timeval end;
38
+
39
+ gettimeofday(&end, NULL);
40
+ return mtime_since(tv, &end);
41
+ }
42
+
43
+ static int test(struct io_uring *ring)
44
+ {
45
+ struct io_uring_cqe *cqe;
46
+ struct io_uring_sqe *sqe;
47
+ struct __kernel_timespec ts;
48
+ struct timeval tv;
49
+ int ret, i;
50
+
51
+ for (i = 0; i < 1; i++) {
52
+ sqe = io_uring_get_sqe(ring);
53
+ if (!sqe) {
54
+ fprintf(stderr, "get sqe failed at %d\n", i);
55
+ goto err;
56
+ }
57
+ io_uring_prep_nop(sqe);
58
+ }
59
+
60
+ ts.tv_sec = 1;
61
+ ts.tv_nsec = 0;
62
+ gettimeofday(&tv, NULL);
63
+ ret = io_uring_submit_and_wait_timeout(ring, &cqe, 2, &ts, NULL);
64
+ if (ret < 0) {
65
+ fprintf(stderr, "submit_and_wait_timeout: %d\n", ret);
66
+ goto err;
67
+ }
68
+ ret = mtime_since_now(&tv);
69
+ /* allow some slack, should be around 1s */
70
+ if (ret > 1200) {
71
+ fprintf(stderr, "wait took too long: %d\n", ret);
72
+ goto err;
73
+ }
74
+ return 0;
75
+ err:
76
+ return 1;
77
+ }
78
+
79
+ static int test_ring(void)
80
+ {
81
+ struct io_uring ring;
82
+ struct io_uring_params p = { };
83
+ int ret;
84
+
85
+ p.flags = 0;
86
+ ret = io_uring_queue_init_params(8, &ring, &p);
87
+ if (ret) {
88
+ fprintf(stderr, "ring setup failed: %d\n", ret);
89
+ return 1;
90
+ }
91
+
92
+ ret = test(&ring);
93
+ if (ret) {
94
+ fprintf(stderr, "test failed\n");
95
+ goto err;
96
+ }
97
+ err:
98
+ io_uring_queue_exit(&ring);
99
+ return ret;
100
+ }
101
+
102
+ int main(int argc, char *argv[])
103
+ {
104
+ if (argc > 1)
105
+ return 0;
106
+
107
+ return test_ring();
108
+ }
@@ -23,7 +23,7 @@ static int test_underprep_fail(bool hardlink, bool drain, bool link_last,
23
23
  struct io_uring ring;
24
24
  struct io_uring_sqe *sqe;
25
25
  struct io_uring_cqe *cqe;
26
- char buffer[1];
26
+ char buffer[1] = { };
27
27
  int i, ret, fds[2];
28
28
 
29
29
  if (drain)
@@ -56,10 +56,12 @@ static int test_underprep_fail(bool hardlink, bool drain, bool link_last,
56
56
 
57
57
  for (i = 0; i < link_size; i++) {
58
58
  sqe = io_uring_get_sqe(&ring);
59
- if (i == fail_idx)
59
+ if (i == fail_idx) {
60
60
  io_uring_prep_read(sqe, invalid_fd, buffer, 1, 0);
61
- else
61
+ sqe->ioprio = (short) -1;
62
+ } else {
62
63
  io_uring_prep_nop(sqe);
64
+ }
63
65
 
64
66
  if (i != link_size - 1 || !link_last)
65
67
  sqe->flags |= link_flags;
@@ -26,13 +26,11 @@ struct thread_data {
26
26
  static void *flusher(void *__data)
27
27
  {
28
28
  struct thread_data *data = __data;
29
- int i = 0;
30
29
 
31
30
  while (!data->do_exit) {
32
31
  posix_fadvise(data->fd1, 0, FILE_SIZE, POSIX_FADV_DONTNEED);
33
32
  posix_fadvise(data->fd2, 0, FILE_SIZE, POSIX_FADV_DONTNEED);
34
33
  usleep(10);
35
- i++;
36
34
  }
37
35
 
38
36
  return NULL;
@@ -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,35 @@
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
+ io_uring_test_config io_uring_test_configs[] = {
18
+ { 0, "default" },
19
+ { IORING_SETUP_SQE128, "large SQE"},
20
+ { IORING_SETUP_CQE32, "large CQE"},
21
+ { IORING_SETUP_SQE128 | IORING_SETUP_CQE32, "large SQE/CQE" },
22
+ };
23
+
24
+ #define FOR_ALL_TEST_CONFIGS \
25
+ for (int i = 0; i < sizeof(io_uring_test_configs) / sizeof(io_uring_test_configs[0]); i++)
26
+
27
+ #define IORING_GET_TEST_CONFIG_FLAGS() (io_uring_test_configs[i].flags)
28
+ #define IORING_GET_TEST_CONFIG_DESCRIPTION() (io_uring_test_configs[i].description)
29
+
30
+
31
+ #ifdef __cplusplus
32
+ }
33
+ #endif
34
+
35
+ #endif
@@ -10,6 +10,7 @@
10
10
  #include <sys/time.h>
11
11
 
12
12
  #include "liburing.h"
13
+ #include "helpers.h"
13
14
 
14
15
  #define TIMEOUT_MSEC 200
15
16
  static int not_supported;
@@ -33,14 +34,13 @@ static int check_timeout_support(void)
33
34
  ret = io_uring_queue_init_params(1, &ring, &p);
34
35
  if (ret) {
35
36
  fprintf(stderr, "ring setup failed: %d\n", ret);
36
- return 1;
37
+ return T_EXIT_FAIL;
37
38
  }
38
39
 
39
40
  /* not really a match, but same kernel added batched completions */
40
41
  if (p.features & IORING_FEAT_POLL_32BITS) {
41
- fprintf(stdout, "Skipping\n");
42
42
  not_supported = 1;
43
- return 0;
43
+ return T_EXIT_SKIP;
44
44
  }
45
45
 
46
46
  sqe = io_uring_get_sqe(&ring);
@@ -67,10 +67,10 @@ static int check_timeout_support(void)
67
67
 
68
68
  io_uring_cqe_seen(&ring, cqe);
69
69
  io_uring_queue_exit(&ring);
70
- return 0;
70
+ return T_EXIT_PASS;
71
71
  err:
72
72
  io_uring_queue_exit(&ring);
73
- return 1;
73
+ return T_EXIT_FAIL;
74
74
  }
75
75
 
76
76
  /*
@@ -183,22 +183,22 @@ int main(int argc, char *argv[])
183
183
  int ret;
184
184
 
185
185
  if (argc > 1)
186
- return 0;
186
+ return T_EXIT_SKIP;
187
187
 
188
188
  ret = check_timeout_support();
189
- if (ret) {
189
+ if (ret == T_EXIT_FAIL) {
190
190
  fprintf(stderr, "check_timeout_support failed: %d\n", ret);
191
- return 1;
191
+ return T_EXIT_FAIL;
192
192
  }
193
193
 
194
194
  if (not_supported)
195
- return 0;
195
+ return T_EXIT_SKIP;
196
196
 
197
197
  ret = test_timeout_overflow();
198
198
  if (ret) {
199
199
  fprintf(stderr, "test_timeout_overflow failed\n");
200
- return 1;
200
+ return T_EXIT_FAIL;
201
201
  }
202
202
 
203
- return 0;
203
+ return T_EXIT_PASS;
204
204
  }
@@ -156,7 +156,7 @@ static int test_single_timeout_nr(struct io_uring *ring, int nr)
156
156
 
157
157
  /*
158
158
  * NOP commands have user_data as 1. Check that we get the
159
- * at least 'nr' NOPs first, then the successfully removed timout.
159
+ * at least 'nr' NOPs first, then the successfully removed timeout.
160
160
  */
161
161
  if (io_uring_cqe_get_data(cqe) == NULL) {
162
162
  if (i < nr) {
@@ -588,7 +588,7 @@ static int test_multi_timeout(struct io_uring *ring)
588
588
  }
589
589
 
590
590
  if (cqe->user_data != user_data) {
591
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
591
+ fprintf(stderr, "%s: unexpected timeout req %d sequence\n",
592
592
  __FUNCTION__, i+1);
593
593
  goto err;
594
594
  }
@@ -678,7 +678,7 @@ static int test_multi_timeout_nr(struct io_uring *ring)
678
678
  case 1:
679
679
  /* Should be timeout req_2 */
680
680
  if (cqe->user_data != 2) {
681
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
681
+ fprintf(stderr, "%s: unexpected timeout req %d sequence\n",
682
682
  __FUNCTION__, i+1);
683
683
  goto err;
684
684
  }
@@ -691,7 +691,7 @@ static int test_multi_timeout_nr(struct io_uring *ring)
691
691
  case 2:
692
692
  /* Should be timeout req_1 */
693
693
  if (cqe->user_data != 1) {
694
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
694
+ fprintf(stderr, "%s: unexpected timeout req %d sequence\n",
695
695
  __FUNCTION__, i+1);
696
696
  goto err;
697
697
  }
@@ -1179,7 +1179,7 @@ static int fill_exec_target(char *dst, char *path)
1179
1179
  struct stat sb;
1180
1180
 
1181
1181
  /*
1182
- * Should either be ./exec-target or test/exec-target
1182
+ * Should either be ./exec-target.t or test/exec-target.t
1183
1183
  */
1184
1184
  sprintf(dst, "%s", path);
1185
1185
  return stat(dst, &sb);
@@ -1193,8 +1193,8 @@ static int test_timeout_link_cancel(void)
1193
1193
  pid_t p;
1194
1194
  int ret, i, wstatus;
1195
1195
 
1196
- if (fill_exec_target(prog_path, "./exec-target") &&
1197
- fill_exec_target(prog_path, "test/exec-target")) {
1196
+ if (fill_exec_target(prog_path, "./exec-target.t") &&
1197
+ fill_exec_target(prog_path, "test/exec-target.t")) {
1198
1198
  fprintf(stdout, "Can't find exec-target, skipping\n");
1199
1199
  return 0;
1200
1200
  }
@@ -0,0 +1,60 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Test double poll tty write. A test case for the regression fixed by:
4
+ *
5
+ * commit 6e295a664efd083ac9a5c1a8130c45be1db0cde7
6
+ * Author: Jens Axboe <axboe@kernel.dk>
7
+ * Date: Tue Mar 22 13:11:28 2022 -0600
8
+ *
9
+ * io_uring: fix assuming triggered poll waitqueue is the single poll
10
+ *
11
+ */
12
+ #include <errno.h>
13
+ #include <stdio.h>
14
+ #include <string.h>
15
+ #include <unistd.h>
16
+ #include <fcntl.h>
17
+
18
+ #include "liburing.h"
19
+ #include "helpers.h"
20
+
21
+ #define SQES 128
22
+ #define BUFSIZE 512
23
+
24
+ int main(int argc, char *argv[])
25
+ {
26
+ static char buf[BUFSIZE];
27
+ struct iovec vecs[SQES];
28
+ struct io_uring ring;
29
+ int ret, i, fd;
30
+
31
+ if (argc > 1)
32
+ return 0;
33
+
34
+ fd = open("/dev/ttyS0", O_RDWR | O_NONBLOCK);
35
+ if (fd < 0)
36
+ return 0;
37
+
38
+ ret = t_create_ring(SQES, &ring, 0);
39
+ if (ret == T_SETUP_SKIP)
40
+ return 0;
41
+ else if (ret < 0)
42
+ return 1;
43
+
44
+ for (i = 0; i < SQES; i++) {
45
+ struct io_uring_sqe *sqe;
46
+
47
+ sqe = io_uring_get_sqe(&ring);
48
+ vecs[i].iov_base = buf;
49
+ vecs[i].iov_len = sizeof(buf);
50
+ io_uring_prep_writev(sqe, fd, &vecs[i], 1, 0);
51
+ }
52
+
53
+ ret = io_uring_submit(&ring);
54
+ if (ret != SQES) {
55
+ fprintf(stderr, "submit: %d\n", ret);
56
+ return 1;
57
+ }
58
+
59
+ return 0;
60
+ }
@@ -24,7 +24,7 @@ static int test_unlink(struct io_uring *ring, const char *old)
24
24
  fprintf(stderr, "get sqe failed\n");
25
25
  goto err;
26
26
  }
27
- io_uring_prep_unlinkat(sqe, AT_FDCWD, old, 0);
27
+ io_uring_prep_unlink(sqe, old, 0);
28
28
 
29
29
  ret = io_uring_submit(ring);
30
30
  if (ret <= 0) {