polyphony 0.94 → 0.96

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +3 -3
  3. data/.github/workflows/test_io_uring.yml +4 -4
  4. data/.gitignore +3 -3
  5. data/CHANGELOG.md +19 -0
  6. data/docs/api-reference/fiber.md +2 -2
  7. data/docs/api-reference/object.md +3 -3
  8. data/docs/main-concepts/exception-handling.md +2 -2
  9. data/examples/adapters/redis_blpop.rb +4 -3
  10. data/examples/adapters/redis_channels.rb +16 -7
  11. data/examples/core/await.rb +1 -1
  12. data/examples/io/readline.rb +19 -0
  13. data/ext/polyphony/backend_common.c +25 -3
  14. data/ext/polyphony/backend_io_uring.c +18 -16
  15. data/ext/polyphony/backend_libev.c +2 -2
  16. data/ext/polyphony/event.c +1 -1
  17. data/ext/polyphony/extconf.rb +5 -3
  18. data/ext/polyphony/fiber.c +5 -13
  19. data/ext/polyphony/io_extensions.c +1 -1
  20. data/ext/polyphony/pipe.c +1 -1
  21. data/ext/polyphony/polyphony.c +1 -1
  22. data/ext/polyphony/polyphony_ext.c +1 -1
  23. data/ext/polyphony/queue.c +1 -1
  24. data/ext/polyphony/ring_buffer.c +1 -0
  25. data/ext/polyphony/socket_extensions.c +1 -1
  26. data/ext/polyphony/thread.c +1 -1
  27. data/lib/polyphony/adapters/readline.rb +6 -4
  28. data/lib/polyphony/adapters/redis.rb +28 -87
  29. data/lib/polyphony/core/channel.rb +15 -0
  30. data/lib/polyphony/core/sync.rb +4 -0
  31. data/lib/polyphony/debugger.rb +2 -2
  32. data/lib/polyphony/extensions/socket.rb +2 -0
  33. data/lib/polyphony/version.rb +1 -1
  34. data/lib/polyphony.rb +4 -0
  35. data/polyphony.gemspec +10 -10
  36. data/test/helper.rb +0 -5
  37. data/test/test_backend.rb +5 -1
  38. data/test/test_enumerator.rb +46 -0
  39. data/test/test_ext.rb +63 -0
  40. data/test/test_io.rb +241 -216
  41. data/test/test_socket.rb +1 -1
  42. data/test/test_thread_pool.rb +5 -5
  43. data/vendor/liburing/.github/workflows/build.yml +51 -5
  44. data/vendor/liburing/.github/workflows/shellcheck.yml +1 -1
  45. data/vendor/liburing/.gitignore +6 -123
  46. data/vendor/liburing/CHANGELOG +35 -0
  47. data/vendor/liburing/CITATION.cff +11 -0
  48. data/vendor/liburing/LICENSE +16 -3
  49. data/vendor/liburing/Makefile +3 -1
  50. data/vendor/liburing/Makefile.common +1 -0
  51. data/vendor/liburing/README +14 -2
  52. data/vendor/liburing/SECURITY.md +6 -0
  53. data/vendor/liburing/configure +16 -15
  54. data/vendor/liburing/examples/Makefile +4 -1
  55. data/vendor/liburing/examples/io_uring-udp.c +395 -0
  56. data/vendor/liburing/examples/poll-bench.c +101 -0
  57. data/vendor/liburing/examples/send-zerocopy.c +339 -0
  58. data/vendor/liburing/liburing.spec +1 -1
  59. data/vendor/liburing/man/io_uring.7 +38 -11
  60. data/vendor/liburing/man/io_uring_buf_ring_add.3 +53 -0
  61. data/vendor/liburing/man/io_uring_buf_ring_advance.3 +31 -0
  62. data/vendor/liburing/man/io_uring_buf_ring_cq_advance.3 +41 -0
  63. data/vendor/liburing/man/io_uring_buf_ring_init.3 +30 -0
  64. data/vendor/liburing/man/io_uring_buf_ring_mask.3 +27 -0
  65. data/vendor/liburing/man/io_uring_cq_advance.3 +29 -15
  66. data/vendor/liburing/man/io_uring_cq_has_overflow.3 +25 -0
  67. data/vendor/liburing/man/io_uring_cq_ready.3 +9 -8
  68. data/vendor/liburing/man/io_uring_cqe_get_data.3 +32 -13
  69. data/vendor/liburing/man/io_uring_cqe_get_data64.3 +1 -0
  70. data/vendor/liburing/man/io_uring_cqe_seen.3 +22 -12
  71. data/vendor/liburing/man/io_uring_enter.2 +249 -32
  72. data/vendor/liburing/man/io_uring_enter2.2 +1 -0
  73. data/vendor/liburing/man/io_uring_free_probe.3 +11 -8
  74. data/vendor/liburing/man/io_uring_get_events.3 +33 -0
  75. data/vendor/liburing/man/io_uring_get_probe.3 +9 -8
  76. data/vendor/liburing/man/io_uring_get_sqe.3 +29 -10
  77. data/vendor/liburing/man/io_uring_opcode_supported.3 +11 -10
  78. data/vendor/liburing/man/io_uring_peek_cqe.3 +38 -0
  79. data/vendor/liburing/man/io_uring_prep_accept.3 +197 -0
  80. data/vendor/liburing/man/io_uring_prep_accept_direct.3 +1 -0
  81. data/vendor/liburing/man/io_uring_prep_cancel.3 +118 -0
  82. data/vendor/liburing/man/io_uring_prep_cancel64.3 +1 -0
  83. data/vendor/liburing/man/io_uring_prep_close.3 +59 -0
  84. data/vendor/liburing/man/io_uring_prep_close_direct.3 +1 -0
  85. data/vendor/liburing/man/io_uring_prep_connect.3 +66 -0
  86. data/vendor/liburing/man/io_uring_prep_fadvise.3 +59 -0
  87. data/vendor/liburing/man/io_uring_prep_fallocate.3 +59 -0
  88. data/vendor/liburing/man/io_uring_prep_files_update.3 +92 -0
  89. data/vendor/liburing/man/io_uring_prep_fsync.3 +70 -0
  90. data/vendor/liburing/man/io_uring_prep_link.3 +1 -0
  91. data/vendor/liburing/man/io_uring_prep_linkat.3 +91 -0
  92. data/vendor/liburing/man/io_uring_prep_madvise.3 +56 -0
  93. data/vendor/liburing/man/io_uring_prep_mkdir.3 +1 -0
  94. data/vendor/liburing/man/io_uring_prep_mkdirat.3 +83 -0
  95. data/vendor/liburing/man/io_uring_prep_msg_ring.3 +39 -25
  96. data/vendor/liburing/man/io_uring_prep_multishot_accept.3 +1 -0
  97. data/vendor/liburing/man/io_uring_prep_multishot_accept_direct.3 +1 -0
  98. data/vendor/liburing/man/io_uring_prep_nop.3 +28 -0
  99. data/vendor/liburing/man/io_uring_prep_openat.3 +117 -0
  100. data/vendor/liburing/man/io_uring_prep_openat2.3 +117 -0
  101. data/vendor/liburing/man/io_uring_prep_openat2_direct.3 +1 -0
  102. data/vendor/liburing/man/io_uring_prep_openat_direct.3 +1 -0
  103. data/vendor/liburing/man/io_uring_prep_poll_add.3 +72 -0
  104. data/vendor/liburing/man/io_uring_prep_poll_multishot.3 +1 -0
  105. data/vendor/liburing/man/io_uring_prep_poll_remove.3 +55 -0
  106. data/vendor/liburing/man/io_uring_prep_poll_update.3 +89 -0
  107. data/vendor/liburing/man/io_uring_prep_provide_buffers.3 +131 -0
  108. data/vendor/liburing/man/io_uring_prep_read.3 +33 -14
  109. data/vendor/liburing/man/io_uring_prep_read_fixed.3 +39 -21
  110. data/vendor/liburing/man/io_uring_prep_readv.3 +49 -15
  111. data/vendor/liburing/man/io_uring_prep_readv2.3 +49 -17
  112. data/vendor/liburing/man/io_uring_prep_recv.3 +105 -0
  113. data/vendor/liburing/man/io_uring_prep_recv_multishot.3 +1 -0
  114. data/vendor/liburing/man/io_uring_prep_recvmsg.3 +124 -0
  115. data/vendor/liburing/man/io_uring_prep_recvmsg_multishot.3 +1 -0
  116. data/vendor/liburing/man/io_uring_prep_remove_buffers.3 +52 -0
  117. data/vendor/liburing/man/io_uring_prep_rename.3 +1 -0
  118. data/vendor/liburing/man/io_uring_prep_renameat.3 +96 -0
  119. data/vendor/liburing/man/io_uring_prep_send.3 +57 -0
  120. data/vendor/liburing/man/io_uring_prep_send_zc.3 +64 -0
  121. data/vendor/liburing/man/io_uring_prep_sendmsg.3 +69 -0
  122. data/vendor/liburing/man/io_uring_prep_shutdown.3 +53 -0
  123. data/vendor/liburing/man/io_uring_prep_socket.3 +118 -0
  124. data/vendor/liburing/man/io_uring_prep_socket_direct.3 +1 -0
  125. data/vendor/liburing/man/io_uring_prep_socket_direct_alloc.3 +1 -0
  126. data/vendor/liburing/man/io_uring_prep_splice.3 +80 -0
  127. data/vendor/liburing/man/io_uring_prep_statx.3 +74 -0
  128. data/vendor/liburing/man/io_uring_prep_symlink.3 +1 -0
  129. data/vendor/liburing/man/io_uring_prep_symlinkat.3 +85 -0
  130. data/vendor/liburing/man/io_uring_prep_sync_file_range.3 +59 -0
  131. data/vendor/liburing/man/io_uring_prep_tee.3 +74 -0
  132. data/vendor/liburing/man/io_uring_prep_timeout.3 +95 -0
  133. data/vendor/liburing/man/io_uring_prep_timeout_remove.3 +1 -0
  134. data/vendor/liburing/man/io_uring_prep_timeout_update.3 +98 -0
  135. data/vendor/liburing/man/io_uring_prep_unlink.3 +1 -0
  136. data/vendor/liburing/man/io_uring_prep_unlinkat.3 +82 -0
  137. data/vendor/liburing/man/io_uring_prep_write.3 +32 -15
  138. data/vendor/liburing/man/io_uring_prep_write_fixed.3 +39 -21
  139. data/vendor/liburing/man/io_uring_prep_writev.3 +50 -16
  140. data/vendor/liburing/man/io_uring_prep_writev2.3 +50 -17
  141. data/vendor/liburing/man/io_uring_queue_exit.3 +3 -4
  142. data/vendor/liburing/man/io_uring_queue_init.3 +58 -13
  143. data/vendor/liburing/man/io_uring_queue_init_params.3 +1 -0
  144. data/vendor/liburing/man/io_uring_recvmsg_cmsg_firsthdr.3 +1 -0
  145. data/vendor/liburing/man/io_uring_recvmsg_cmsg_nexthdr.3 +1 -0
  146. data/vendor/liburing/man/io_uring_recvmsg_name.3 +1 -0
  147. data/vendor/liburing/man/io_uring_recvmsg_out.3 +78 -0
  148. data/vendor/liburing/man/io_uring_recvmsg_payload.3 +1 -0
  149. data/vendor/liburing/man/io_uring_recvmsg_payload_length.3 +1 -0
  150. data/vendor/liburing/man/io_uring_recvmsg_validate.3 +1 -0
  151. data/vendor/liburing/man/io_uring_register.2 +153 -13
  152. data/vendor/liburing/man/io_uring_register_buf_ring.3 +140 -0
  153. data/vendor/liburing/man/io_uring_register_buffers.3 +32 -12
  154. data/vendor/liburing/man/io_uring_register_eventfd.3 +51 -0
  155. data/vendor/liburing/man/io_uring_register_eventfd_async.3 +1 -0
  156. data/vendor/liburing/man/io_uring_register_file_alloc_range.3 +52 -0
  157. data/vendor/liburing/man/io_uring_register_files.3 +33 -11
  158. data/vendor/liburing/man/io_uring_register_files_sparse.3 +1 -0
  159. data/vendor/liburing/man/io_uring_register_iowq_aff.3 +61 -0
  160. data/vendor/liburing/man/io_uring_register_iowq_max_workers.3 +71 -0
  161. data/vendor/liburing/man/io_uring_register_ring_fd.3 +49 -0
  162. data/vendor/liburing/man/io_uring_register_sync_cancel.3 +71 -0
  163. data/vendor/liburing/man/io_uring_setup.2 +119 -13
  164. data/vendor/liburing/man/io_uring_sq_ready.3 +14 -8
  165. data/vendor/liburing/man/io_uring_sq_space_left.3 +9 -9
  166. data/vendor/liburing/man/io_uring_sqe_set_data.3 +29 -11
  167. data/vendor/liburing/man/io_uring_sqe_set_data64.3 +1 -0
  168. data/vendor/liburing/man/io_uring_sqe_set_flags.3 +38 -11
  169. data/vendor/liburing/man/io_uring_sqring_wait.3 +13 -9
  170. data/vendor/liburing/man/io_uring_submit.3 +29 -12
  171. data/vendor/liburing/man/io_uring_submit_and_get_events.3 +31 -0
  172. data/vendor/liburing/man/io_uring_submit_and_wait.3 +16 -12
  173. data/vendor/liburing/man/io_uring_submit_and_wait_timeout.3 +30 -23
  174. data/vendor/liburing/man/io_uring_unregister_buf_ring.3 +30 -0
  175. data/vendor/liburing/man/io_uring_unregister_buffers.3 +11 -10
  176. data/vendor/liburing/man/io_uring_unregister_eventfd.3 +1 -0
  177. data/vendor/liburing/man/io_uring_unregister_files.3 +11 -10
  178. data/vendor/liburing/man/io_uring_unregister_iowq_aff.3 +1 -0
  179. data/vendor/liburing/man/io_uring_unregister_ring_fd.3 +32 -0
  180. data/vendor/liburing/man/io_uring_wait_cqe.3 +19 -12
  181. data/vendor/liburing/man/io_uring_wait_cqe_nr.3 +21 -14
  182. data/vendor/liburing/man/io_uring_wait_cqe_timeout.3 +27 -13
  183. data/vendor/liburing/man/io_uring_wait_cqes.3 +24 -14
  184. data/vendor/liburing/src/Makefile +8 -7
  185. data/vendor/liburing/src/arch/aarch64/lib.h +48 -0
  186. data/vendor/liburing/src/arch/aarch64/syscall.h +0 -4
  187. data/vendor/liburing/src/arch/generic/lib.h +0 -4
  188. data/vendor/liburing/src/arch/generic/syscall.h +29 -16
  189. data/vendor/liburing/src/arch/syscall-defs.h +41 -14
  190. data/vendor/liburing/src/arch/x86/lib.h +0 -21
  191. data/vendor/liburing/src/arch/x86/syscall.h +146 -10
  192. data/vendor/liburing/src/include/liburing/io_uring.h +245 -5
  193. data/vendor/liburing/src/include/liburing.h +468 -35
  194. data/vendor/liburing/src/int_flags.h +1 -0
  195. data/vendor/liburing/src/lib.h +20 -16
  196. data/vendor/liburing/src/liburing.map +16 -0
  197. data/vendor/liburing/src/nolibc.c +1 -1
  198. data/vendor/liburing/src/queue.c +87 -55
  199. data/vendor/liburing/src/register.c +129 -53
  200. data/vendor/liburing/src/setup.c +65 -28
  201. data/vendor/liburing/src/syscall.c +14 -32
  202. data/vendor/liburing/src/syscall.h +12 -64
  203. data/vendor/liburing/test/{232c93d07b74-test.c → 232c93d07b74.c} +8 -9
  204. data/vendor/liburing/test/{35fa71a030ca-test.c → 35fa71a030ca.c} +4 -4
  205. data/vendor/liburing/test/{500f9fbadef8-test.c → 500f9fbadef8.c} +7 -7
  206. data/vendor/liburing/test/{7ad0e4b2f83c-test.c → 7ad0e4b2f83c.c} +8 -7
  207. data/vendor/liburing/test/{8a9973408177-test.c → 8a9973408177.c} +4 -3
  208. data/vendor/liburing/test/{917257daa0fe-test.c → 917257daa0fe.c} +3 -2
  209. data/vendor/liburing/test/Makefile +60 -62
  210. data/vendor/liburing/test/{a0908ae19763-test.c → a0908ae19763.c} +3 -2
  211. data/vendor/liburing/test/{a4c0b3decb33-test.c → a4c0b3decb33.c} +3 -2
  212. data/vendor/liburing/test/accept-link.c +5 -4
  213. data/vendor/liburing/test/accept-reuse.c +17 -16
  214. data/vendor/liburing/test/accept-test.c +14 -10
  215. data/vendor/liburing/test/accept.c +529 -107
  216. data/vendor/liburing/test/across-fork.c +7 -6
  217. data/vendor/liburing/test/{b19062a56726-test.c → b19062a56726.c} +3 -2
  218. data/vendor/liburing/test/{b5837bd5311d-test.c → b5837bd5311d.c} +10 -9
  219. data/vendor/liburing/test/buf-ring.c +420 -0
  220. data/vendor/liburing/test/{ce593a6c480a-test.c → ce593a6c480a.c} +15 -12
  221. data/vendor/liburing/test/connect.c +8 -7
  222. data/vendor/liburing/test/cq-full.c +5 -4
  223. data/vendor/liburing/test/cq-overflow.c +242 -12
  224. data/vendor/liburing/test/cq-peek-batch.c +5 -4
  225. data/vendor/liburing/test/cq-ready.c +5 -4
  226. data/vendor/liburing/test/cq-size.c +5 -4
  227. data/vendor/liburing/test/{d4ae271dfaae-test.c → d4ae271dfaae.c} +2 -2
  228. data/vendor/liburing/test/{d77a67ed5f27-test.c → d77a67ed5f27.c} +6 -6
  229. data/vendor/liburing/test/defer-taskrun.c +336 -0
  230. data/vendor/liburing/test/defer.c +26 -14
  231. data/vendor/liburing/test/double-poll-crash.c +15 -5
  232. data/vendor/liburing/test/drop-submit.c +5 -3
  233. data/vendor/liburing/test/{eeed8b54e0df-test.c → eeed8b54e0df.c} +7 -6
  234. data/vendor/liburing/test/empty-eownerdead.c +4 -4
  235. data/vendor/liburing/test/eventfd-disable.c +48 -20
  236. data/vendor/liburing/test/eventfd-reg.c +10 -9
  237. data/vendor/liburing/test/eventfd-ring.c +13 -12
  238. data/vendor/liburing/test/eventfd.c +13 -12
  239. data/vendor/liburing/test/exit-no-cleanup.c +1 -1
  240. data/vendor/liburing/test/fadvise.c +3 -3
  241. data/vendor/liburing/test/fallocate.c +16 -9
  242. data/vendor/liburing/test/{fc2a85cb02ef-test.c → fc2a85cb02ef.c} +4 -3
  243. data/vendor/liburing/test/fd-pass.c +187 -0
  244. data/vendor/liburing/test/file-register.c +302 -36
  245. data/vendor/liburing/test/file-update.c +62 -4
  246. data/vendor/liburing/test/file-verify.c +6 -2
  247. data/vendor/liburing/test/files-exit-hang-poll.c +11 -25
  248. data/vendor/liburing/test/files-exit-hang-timeout.c +13 -10
  249. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  250. data/vendor/liburing/test/fixed-link.c +10 -10
  251. data/vendor/liburing/test/fixed-reuse.c +160 -0
  252. data/vendor/liburing/test/fpos.c +6 -3
  253. data/vendor/liburing/test/fsync.c +3 -3
  254. data/vendor/liburing/test/hardlink.c +10 -6
  255. data/vendor/liburing/test/helpers.c +137 -4
  256. data/vendor/liburing/test/helpers.h +27 -0
  257. data/vendor/liburing/test/io-cancel.c +16 -11
  258. data/vendor/liburing/test/io_uring_enter.c +46 -81
  259. data/vendor/liburing/test/io_uring_passthrough.c +451 -0
  260. data/vendor/liburing/test/io_uring_register.c +59 -229
  261. data/vendor/liburing/test/io_uring_setup.c +24 -29
  262. data/vendor/liburing/test/iopoll-leak.c +85 -0
  263. data/vendor/liburing/test/iopoll.c +16 -9
  264. data/vendor/liburing/test/lfs-openat-write.c +3 -1
  265. data/vendor/liburing/test/link-timeout.c +4 -3
  266. data/vendor/liburing/test/link.c +8 -7
  267. data/vendor/liburing/test/madvise.c +2 -2
  268. data/vendor/liburing/test/mkdir.c +9 -5
  269. data/vendor/liburing/test/msg-ring.c +46 -20
  270. data/vendor/liburing/test/multicqes_drain.c +51 -12
  271. data/vendor/liburing/test/nolibc.c +60 -0
  272. data/vendor/liburing/test/nop.c +78 -16
  273. data/vendor/liburing/test/nvme.h +168 -0
  274. data/vendor/liburing/test/open-direct-link.c +188 -0
  275. data/vendor/liburing/test/open-direct-pick.c +180 -0
  276. data/vendor/liburing/test/openat2.c +3 -3
  277. data/vendor/liburing/test/poll-cancel-all.c +472 -0
  278. data/vendor/liburing/test/poll-link.c +9 -18
  279. data/vendor/liburing/test/poll-mshot-overflow.c +162 -0
  280. data/vendor/liburing/test/poll-mshot-update.c +83 -33
  281. data/vendor/liburing/test/pollfree.c +2 -2
  282. data/vendor/liburing/test/read-before-exit.c +112 -0
  283. data/vendor/liburing/test/read-write.c +83 -1
  284. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  285. data/vendor/liburing/test/recv-msgall.c +265 -0
  286. data/vendor/liburing/test/recv-multishot.c +505 -0
  287. data/vendor/liburing/test/rename.c +2 -5
  288. data/vendor/liburing/test/ring-leak.c +97 -0
  289. data/vendor/liburing/test/ringbuf-read.c +200 -0
  290. data/vendor/liburing/test/rsrc_tags.c +25 -13
  291. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  292. data/vendor/liburing/test/runtests.sh +18 -20
  293. data/vendor/liburing/test/rw_merge_test.c +3 -2
  294. data/vendor/liburing/test/send-zerocopy.c +684 -0
  295. data/vendor/liburing/test/send_recv.c +49 -2
  296. data/vendor/liburing/test/send_recvmsg.c +165 -55
  297. data/vendor/liburing/test/shutdown.c +3 -4
  298. data/vendor/liburing/test/sigfd-deadlock.c +22 -8
  299. data/vendor/liburing/test/single-issuer.c +171 -0
  300. data/vendor/liburing/test/socket-rw-eagain.c +2 -12
  301. data/vendor/liburing/test/socket-rw-offset.c +2 -11
  302. data/vendor/liburing/test/socket-rw.c +2 -11
  303. data/vendor/liburing/test/socket.c +409 -0
  304. data/vendor/liburing/test/sq-poll-dup.c +1 -1
  305. data/vendor/liburing/test/sq-poll-share.c +1 -1
  306. data/vendor/liburing/test/statx.c +2 -2
  307. data/vendor/liburing/test/submit-and-wait.c +108 -0
  308. data/vendor/liburing/test/submit-link-fail.c +5 -3
  309. data/vendor/liburing/test/submit-reuse.c +0 -2
  310. data/vendor/liburing/test/sync-cancel.c +235 -0
  311. data/vendor/liburing/test/test.h +35 -0
  312. data/vendor/liburing/test/timeout-overflow.c +11 -11
  313. data/vendor/liburing/test/timeout.c +7 -7
  314. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  315. data/vendor/liburing/test/unlink.c +1 -1
  316. data/vendor/liburing/test/xattr.c +425 -0
  317. metadata +160 -52
  318. data/Gemfile.lock +0 -78
@@ -2,94 +2,35 @@
2
2
 
3
3
  require_relative '../../polyphony'
4
4
 
5
- require 'redis'
6
- require 'hiredis/reader'
7
-
8
- # Polyphony-based Redis driver
9
- class Polyphony::RedisDriver
10
-
11
- # Connects to a Redis server using the given config.
12
- #
13
- # @return [TCPSocket, UNIXSocket, SSLSocket] client connectio
14
- def self.connect(config)
15
- raise 'unix sockets not supported' if config[:scheme] == 'unix'
16
-
17
- # connection.connect_unix(config[:path], connect_timeout)
18
-
19
- raise 'ssl not supported' if config[:scheme] == 'rediss' || config[:ssl]
20
-
21
- # raise NotImplementedError, "SSL not supported by hiredis driver"
22
-
23
- new(config[:host], config[:port])
24
- # connection.connect(config[:host], config[:port], connect_timeout)
25
- end
26
-
27
- # Initializes a Redis client connection.
28
- #
29
- # @param host [String] hostname
30
- # @param port [Integer] port number
31
- def initialize(host, port)
32
- @connection = Polyphony::Net.tcp_connect(host, port)
33
- @reader = ::Hiredis::Reader.new
34
- end
35
-
36
- # Returns true if connected to server.
37
- #
38
- # @return [bool] is connected to server
39
- def connected?
40
- @connection && !@connection.closed?
41
- end
42
-
43
- # Sets a timeout for the connection.
44
- #
45
- # @return [void]
46
- def timeout=(timeout)
47
- # ignore timeout for now
48
- end
49
-
50
- # Disconnects from the server.
51
- #
52
- # @return [void]
53
- def disconnect
54
- @connection.close
55
- @connection = nil
56
- end
57
-
58
- # Sends a command to the server.
59
- #
60
- # @param command [Array] Redis command
61
- # @return [void]
62
- def write(command)
63
- @connection.write(format_command(command))
64
- end
65
-
66
- # Formats a command for sending to server.
67
- #
68
- # @param args [Array] command
69
- # @return [String] formatted command
70
- def format_command(args)
71
- args = args.flatten
72
- (+"*#{args.size}\r\n").tap do |s|
73
- args.each do |a|
74
- a = a.to_s
75
- s << "$#{a.bytesize}\r\n#{a}\r\n"
5
+ require 'redis-client'
6
+
7
+ class RedisClient
8
+ class RubyConnection
9
+ class BufferedIO
10
+ def fill_buffer(strict, size = @chunk_size)
11
+ remaining = size
12
+ empty_buffer = @offset >= @buffer.bytesize
13
+
14
+ loop do
15
+ max_read = [remaining, @chunk_size].max
16
+ bytes = if empty_buffer
17
+ @io.readpartial(max_read, @buffer)
18
+ else
19
+ @io.readpartial(max_read)
20
+ end
21
+
22
+ raise Errno::ECONNRESET if bytes.nil?
23
+
24
+ if empty_buffer
25
+ @offset = 0
26
+ empty_buffer = false
27
+ else
28
+ @buffer << bytes
29
+ end
30
+ remaining -= bytes.bytesize
31
+ return if !strict || remaining <= 0
32
+ end
76
33
  end
77
34
  end
78
35
  end
79
-
80
- # Reads from the connection, feeding incoming data to the parser.
81
- #
82
- # @return [void]
83
- def read
84
- reply = @reader.gets
85
- return reply if reply
86
-
87
- @connection.read_loop do |data|
88
- @reader.feed(data)
89
- reply = @reader.gets
90
- return reply unless reply == false
91
- end
92
- end
93
36
  end
94
-
95
- Redis::Connection.drivers << Polyphony::RedisDriver
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../polyphony'
4
+
5
+ module Polyphony
6
+ # Implements a unidirectional communication channel along the lines of Go
7
+ # (buffered) channels.
8
+ class Channel < Polyphony::Queue
9
+ alias_method :receive, :shift
10
+
11
+ def close
12
+ flush_waiters(Polyphony::MoveOn.new)
13
+ end
14
+ end
15
+ end
@@ -101,6 +101,8 @@ module Polyphony
101
101
  #
102
102
  # @return [void]
103
103
  def signal
104
+ return if @queue.empty?
105
+
104
106
  fiber = @queue.shift
105
107
  fiber.schedule
106
108
  end
@@ -109,6 +111,8 @@ module Polyphony
109
111
  #
110
112
  # @return [void]
111
113
  def broadcast
114
+ return if @queue.empty?
115
+
112
116
  while (fiber = @queue.shift)
113
117
  fiber.schedule
114
118
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'polyphony/extensions/debug'
3
+ require 'polyphony/core/debug'
4
4
 
5
5
  module Polyphony
6
6
  TP_EVENTS = [
@@ -188,7 +188,7 @@ module Polyphony
188
188
  def start_server_thread
189
189
  @thread = Thread.new do
190
190
  puts("Listening on #{@socket_path}")
191
- FileUtils.rm(@socket_path) if File.exists?(@socket_path)
191
+ FileUtils.rm(@socket_path) if File.exist?(@socket_path)
192
192
  socket = UNIXServer.new(@socket_path)
193
193
  loop do
194
194
  @client = socket.accept
@@ -194,6 +194,8 @@ class ::Socket
194
194
  def readpartial(maxlen, buf = +'', buf_pos = 0, raise_on_eof = true)
195
195
  result = Polyphony.backend_recv(self, buf, maxlen, buf_pos)
196
196
  raise EOFError if !result && raise_on_eof
197
+
198
+ result
197
199
  end
198
200
 
199
201
  ZERO_LINGER = [0, 0].pack('ii').freeze
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.94'
4
+ VERSION = '0.96'
5
5
  end
data/lib/polyphony.rb CHANGED
@@ -117,6 +117,10 @@ module Polyphony
117
117
  $VERBOSE = nil
118
118
  Object.const_set(:Queue, Polyphony::Queue)
119
119
  Object.const_set(:Mutex, Polyphony::Mutex)
120
+
121
+ require 'monitor'
122
+ Object.const_set(:Monitor, Polyphony::Mutex)
123
+
120
124
  Object.const_set(:ConditionVariable, Polyphony::ConditionVariable)
121
125
  $VERBOSE = verbose
122
126
  end
data/polyphony.gemspec CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.homepage = 'https://digital-fabric.github.io/polyphony'
12
12
  s.metadata = {
13
13
  "source_code_uri" => "https://github.com/digital-fabric/polyphony",
14
+ # "documentation_uri" => "https://www.rubydoc.info/gems/polyphony",
14
15
  "documentation_uri" => "https://digital-fabric.github.io/polyphony/",
15
16
  "homepage_uri" => "https://digital-fabric.github.io/polyphony/",
16
17
  "changelog_uri" => "https://github.com/digital-fabric/polyphony/blob/master/CHANGELOG.md"
@@ -19,18 +20,17 @@ Gem::Specification.new do |s|
19
20
  s.extra_rdoc_files = ["README.md"]
20
21
  s.extensions = ["ext/polyphony/extconf.rb"]
21
22
  s.require_paths = ["lib"]
22
- s.required_ruby_version = '>= 2.6'
23
+ s.required_ruby_version = '>= 3.0'
23
24
 
24
- s.add_development_dependency 'rake-compiler', '1.1.1'
25
- s.add_development_dependency 'minitest', '5.14.4'
26
- s.add_development_dependency 'minitest-reporters', '1.4.2'
27
- s.add_development_dependency 'simplecov', '0.17.1'
28
- s.add_development_dependency 'rubocop', '0.85.1'
29
- s.add_development_dependency 'pry', '0.13.1'
25
+ s.add_development_dependency 'rake-compiler', '1.2.1'
26
+ s.add_development_dependency 'minitest', '5.17.0'
27
+ s.add_development_dependency 'simplecov', '0.22.0'
28
+ s.add_development_dependency 'rubocop', '1.45.1'
29
+ s.add_development_dependency 'pry', '0.14.2'
30
30
 
31
- s.add_development_dependency 'msgpack', '1.4.2'
32
- s.add_development_dependency 'httparty', '0.17.1'
33
- s.add_development_dependency 'localhost', '~>1.1.4'
31
+ s.add_development_dependency 'msgpack', '1.6.0'
32
+ s.add_development_dependency 'httparty', '0.21.0'
33
+ s.add_development_dependency 'localhost', '1.1.10'
34
34
 
35
35
  # s.add_development_dependency 'jekyll', '~>3.8.6'
36
36
  # s.add_development_dependency 'jekyll-remote-theme', '~>0.4.1'
data/test/helper.rb CHANGED
@@ -11,16 +11,11 @@ require 'fileutils'
11
11
  require_relative './eg'
12
12
 
13
13
  require 'minitest/autorun'
14
- require 'minitest/reporters'
15
14
 
16
15
  ::Exception.__disable_sanitized_backtrace__ = true
17
16
 
18
17
  IS_LINUX = RUBY_PLATFORM =~ /linux/
19
18
 
20
- # Minitest::Reporters.use! [
21
- # Minitest::Reporters::SpecReporter.new
22
- # ]
23
-
24
19
  module ::Kernel
25
20
  def trace(*args)
26
21
  STDOUT.orig_write(format_trace(args))
data/test/test_backend.rb CHANGED
@@ -144,8 +144,12 @@ class BackendTest < MiniTest::Test
144
144
  buf << :done
145
145
  end
146
146
 
147
- # writing always causes snoozing
147
+ # Caution: we want to read in two chunks, that a race condition lurks here:
148
+ # writing always causes snoozing, but that might not be enough for the
149
+ # reader fiber to perform the read before the second write, so for the test
150
+ # to work consistently we add a little sleep between the two writes.
148
151
  o << 'foo'
152
+ sleep 0.03
149
153
  o << 'bar'
150
154
  o.close
151
155
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+
5
+ class EnumeratorTest < MiniTest::Test
6
+ def test_each_enumerator
7
+ o = [1, 2, 3]
8
+ e = o.each
9
+
10
+ r = []
11
+ loop do
12
+ r << e.next
13
+ rescue StopIteration
14
+ break
15
+ end
16
+
17
+ assert_equal o, r
18
+ end
19
+
20
+ def test_custom_io_enumerator
21
+ i, o = IO.pipe
22
+
23
+ spin do
24
+ 10.times { o.puts 'foo' }
25
+ o.close
26
+ end
27
+
28
+ e_fiber = nil
29
+ e = Enumerator.new do |y|
30
+ e_fiber ||= Fiber.current
31
+ while (l = i.gets)
32
+ y << l
33
+ end
34
+ end
35
+
36
+ r = []
37
+ loop do
38
+ r << e.next
39
+ rescue StopIteration
40
+ break
41
+ end
42
+
43
+ assert_equal ["foo\n"] * 10, r
44
+ assert Fiber.current != e_fiber
45
+ end
46
+ end
data/test/test_ext.rb CHANGED
@@ -39,6 +39,69 @@ class ExceptionTest < MiniTest::Test
39
39
  Exception.__disable_sanitized_backtrace__ = prev_disable
40
40
  end
41
41
 
42
+ LOCATION_ONLY = ->(s) { s =~ /^(.+)\:in / && Regexp.last_match[1] }
43
+
44
+ def test_backtrace_on_main_fiber
45
+ base = caller.map(&LOCATION_ONLY)
46
+ begin
47
+ lineno = __LINE__ + 1
48
+ raise 'foo'
49
+ rescue => e
50
+ end
51
+
52
+ assert !!e
53
+
54
+ bt = e.backtrace.map(&LOCATION_ONLY)
55
+ assert_equal ["#{__FILE__}:#{lineno}"] + base, bt
56
+ end
57
+
58
+ def test_backtrace_on_child_fiber
59
+ Exception.__disable_sanitized_backtrace__ = false
60
+
61
+ lineno = __LINE__ + 1
62
+ fiber = spin do
63
+ raise receive
64
+ end
65
+
66
+ base = caller.map(&LOCATION_ONLY)
67
+
68
+ begin
69
+ fiber << 'foo'
70
+ fiber.await
71
+ rescue => e
72
+ end
73
+
74
+ assert !!e
75
+ bt = e.backtrace.map(&LOCATION_ONLY)
76
+ assert_equal ["#{__FILE__}:#{lineno + 1}", "#{__FILE__}:#{lineno}"] + base, bt
77
+ ensure
78
+ Exception.__disable_sanitized_backtrace__ = true
79
+ end
80
+
81
+ def test_backtrace_on_grand_child_fiber
82
+ Exception.__disable_sanitized_backtrace__ = false
83
+
84
+ lineno = __LINE__ + 1
85
+ f1 = spin do
86
+ f2 = spin do
87
+ raise 'foo'
88
+ end
89
+ f2.await
90
+ end
91
+
92
+ base = caller.map(&LOCATION_ONLY)
93
+
94
+ begin
95
+ f1.await
96
+ rescue => e
97
+ end
98
+
99
+ assert !!e
100
+ bt = e.backtrace.map(&LOCATION_ONLY)
101
+ assert_equal ["#{__FILE__}:#{lineno + 2}", "#{__FILE__}:#{lineno + 1}", "#{__FILE__}:#{lineno}"] + base, bt
102
+ ensure
103
+ Exception.__disable_sanitized_backtrace__ = true
104
+ end
42
105
  end
43
106
 
44
107
  class ProcessTest < MiniTest::Test