uringmachine 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
data/test/test_um.rb ADDED
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+ require 'socket'
5
+
6
+ class SleepTest < UMBaseTest
7
+ def test_sleep
8
+ t0 = monotonic_clock
9
+ res = machine.sleep(0.1)
10
+ t1 = monotonic_clock
11
+ assert_in_range 0.09..0.13, t1 - t0
12
+ assert_equal 0.1, res
13
+ end
14
+ end
15
+
16
+ class SchedulingTest < UMBaseTest
17
+ def test_schedule_and_yield
18
+ buf = []
19
+ cur = Fiber.current
20
+ f = Fiber.new do |x|
21
+ buf << [21, x]
22
+ machine.schedule(cur, 21)
23
+ buf << 22
24
+ x = machine.yield
25
+ buf << [23, x]
26
+ end
27
+
28
+ buf << 11
29
+ machine.schedule(f, 11)
30
+ buf << 12
31
+ x = machine.yield
32
+ buf << [13, x]
33
+
34
+ assert_equal [11, 12, [21, 11], 22, [13, 21]], buf
35
+ end
36
+
37
+ class CustomError < Exception
38
+ end
39
+
40
+ def test_schedule_exception
41
+ buf = []
42
+ f = Fiber.new do
43
+ # this should raise
44
+ machine.yield
45
+ rescue Exception => e
46
+ buf << e
47
+ machine.yield
48
+ end
49
+
50
+ machine.schedule(f, nil)
51
+ # start the f fiber
52
+ machine.snooze
53
+
54
+ # f fiber has yielded
55
+ e = CustomError.new
56
+ machine.schedule(f, e)
57
+ machine.snooze
58
+
59
+ assert_equal [e], buf
60
+ end
61
+
62
+ def test_interrupt
63
+ cur = Fiber.current
64
+ e = CustomError.new
65
+ f = Fiber.new do
66
+ machine.interrupt(cur, e)
67
+ assert_equal 2, machine.pending_count
68
+ machine.yield
69
+ end
70
+
71
+ machine.schedule(f, nil)
72
+ t0 = monotonic_clock
73
+
74
+ # the call to schedule means an op is checked out
75
+ assert_equal 1, machine.pending_count
76
+ begin
77
+ machine.sleep(1)
78
+ rescue Exception => e2
79
+ end
80
+ # the sleep op has been cancelled, but we still need to process the
81
+ # cancellation. Calling snooze should take care of that.
82
+ assert_equal 1, machine.pending_count
83
+ machine.snooze
84
+
85
+ # CQE should have been received, and the op checked in
86
+ assert_equal 0, machine.pending_count
87
+ t1 = monotonic_clock
88
+
89
+ assert_equal e2, e
90
+ assert_in_range 0..0.1, t1 - t0
91
+ end
92
+
93
+ class TOError < RuntimeError; end
94
+
95
+ def test_timeout
96
+ buf = []
97
+ begin
98
+ buf << 1
99
+ machine.timeout(0.01, TOError) do
100
+ buf << 2
101
+ machine.sleep(1)
102
+ buf << 3
103
+ end
104
+ buf << 4
105
+ rescue => e
106
+ buf << 5
107
+ end
108
+
109
+ # at this point, the sleep cancelled CQE should not yet have been received.
110
+ # So we still have a pending operation. Snooze should have let the CQE be
111
+ # received.
112
+ assert_equal 1, machine.pending_count
113
+ machine.snooze
114
+ assert_equal 0, machine.pending_count
115
+
116
+ assert_equal [1, 2, 5], buf
117
+ assert_kind_of TOError, e
118
+ end
119
+
120
+ def test_timeout_with_raising_block
121
+ e = nil
122
+ v = begin
123
+ machine.timeout(0.01, TOError) do
124
+ raise 'hi'
125
+ end
126
+ rescue => e
127
+ end
128
+
129
+ assert_equal 1, machine.pending_count
130
+ machine.snooze
131
+ assert_equal 0, machine.pending_count
132
+
133
+ assert_kind_of RuntimeError, e
134
+ assert_equal 'hi', e.message
135
+ end
136
+
137
+ def test_timeout_with_nothing_blocking
138
+ v = machine.timeout(0.01, TOError) { 42 }
139
+
140
+ assert_equal 42, v
141
+
142
+ assert_equal 1, machine.pending_count
143
+ machine.snooze
144
+ assert_equal 0, machine.pending_count
145
+ end
146
+
147
+ class TO2Error < RuntimeError; end
148
+ class TO3Error < RuntimeError; end
149
+
150
+ def test_timeout_nested
151
+ e = nil
152
+ buf = []
153
+ begin
154
+ machine.timeout(0.04, TOError) do
155
+ machine.timeout(0.02, TO2Error) do
156
+ machine.timeout(0.03, TO3Error) do
157
+ buf << machine.pending_count
158
+ machine.sleep(1)
159
+ end
160
+ end
161
+ end
162
+ rescue => e
163
+ end
164
+
165
+ assert_kind_of TO2Error, e
166
+ assert_equal [3], buf
167
+ end
168
+ end
@@ -0,0 +1,27 @@
1
+ require_relative './lib/uringmachine/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'uringmachine'
5
+ s.version = UM_VERSION
6
+ s.licenses = ['MIT']
7
+ s.summary = 'A lean, mean io_uring machine'
8
+ s.author = 'Sharon Rosner'
9
+ s.email = 'sharon@noteflakes.com'
10
+ s.files = `git ls-files --recurse-submodules`.split.reject { |fn| fn =~ /liburing\/man/ }
11
+ s.homepage = 'https://github.com/digital-fabric/uringmachine'
12
+ s.metadata = {
13
+ "source_code_uri" => "https://github.com/digital-fabric/uringmachine",
14
+ "documentation_uri" => "https://www.rubydoc.info/gems/uringmachine",
15
+ "changelog_uri" => "https://github.com/digital-fabric/uringmachine/blob/master/CHANGELOG.md"
16
+ }
17
+ s.rdoc_options = ["--title", "UringMachine", "--main", "README.md"]
18
+ s.extra_rdoc_files = ["README.md"]
19
+ s.extensions = ["ext/um/extconf.rb"]
20
+ s.require_paths = ["lib"]
21
+ s.required_ruby_version = '>= 3.3'
22
+
23
+ s.add_development_dependency 'rake-compiler', '1.2.7'
24
+ s.add_development_dependency 'minitest', '5.25.1'
25
+ s.add_development_dependency 'http_parser.rb', '0.8.0'
26
+ s.add_development_dependency 'benchmark-ips', '2.10.0'
27
+ end
@@ -0,0 +1,7 @@
1
+ bu
2
+ cancelation
3
+ cancelations
4
+ cant
5
+ pring
6
+ sring
7
+ wont
@@ -0,0 +1,86 @@
1
+
2
+ <!-- Explain your changes here... -->
3
+
4
+ ----
5
+ ## git request-pull output:
6
+ ```
7
+ <!-- START REPLACE ME -->
8
+
9
+ Generate your PR shortlog and diffstat with these commands:
10
+ git remote add axboe-tree https://github.com/axboe/liburing
11
+ git fetch axboe-tree
12
+ git request-pull axboe-tree/master your_fork_URL your_branch_name
13
+
14
+ Then replace this with the output of `git request-pull` command.
15
+
16
+ <!-- END REPLACE ME -->
17
+ ```
18
+ ----
19
+ <details>
20
+ <summary>Click to show/hide pull request guidelines</summary>
21
+
22
+ ## Pull Request Guidelines
23
+ 1. To make everyone easily filter pull request from the email
24
+ notification, use `[GIT PULL]` as a prefix in your PR title.
25
+ ```
26
+ [GIT PULL] Your Pull Request Title
27
+ ```
28
+ 2. Follow the commit message format rules below.
29
+ 3. Follow the Linux kernel coding style (see: https://github.com/torvalds/linux/blob/master/Documentation/process/coding-style.rst).
30
+
31
+ ### Commit message format rules:
32
+ 1. The first line is title (don't be more than 72 chars if possible).
33
+ 2. Then an empty line.
34
+ 3. Then a description (may be omitted for truly trivial changes).
35
+ 4. Then an empty line again (if it has a description).
36
+ 5. Then a `Signed-off-by` tag with your real name and email. For example:
37
+ ```
38
+ Signed-off-by: Foo Bar <foo.bar@gmail.com>
39
+ ```
40
+
41
+ The description should be word-wrapped at 72 chars. Some things should
42
+ not be word-wrapped. They may be some kind of quoted text - long
43
+ compiler error messages, oops reports, Link, etc. (things that have a
44
+ certain specific format).
45
+
46
+ Note that all of this goes in the commit message, not in the pull
47
+ request text. The pull request text should introduce what this pull
48
+ request does, and each commit message should explain the rationale for
49
+ why that particular change was made. The git tree is canonical source
50
+ of truth, not github.
51
+
52
+ Each patch should do one thing, and one thing only. If you find yourself
53
+ writing an explanation for why a patch is fixing multiple issues, that's
54
+ a good indication that the change should be split into separate patches.
55
+
56
+ If the commit is a fix for an issue, add a `Fixes` tag with the issue
57
+ URL.
58
+
59
+ Don't use GitHub anonymous email like this as the commit author:
60
+ ```
61
+ 123456789+username@users.noreply.github.com
62
+ ```
63
+
64
+ Use a real email address!
65
+
66
+ ### Commit message example:
67
+ ```
68
+ src/queue: don't flush SQ ring for new wait interface
69
+
70
+ If we have IORING_FEAT_EXT_ARG, then timeouts are done through the
71
+ syscall instead of by posting an internal timeout. This was done
72
+ to be both more efficient, but also to enable multi-threaded use
73
+ the wait side. If we touch the SQ state by flushing it, that isn't
74
+ safe without synchronization.
75
+
76
+ Fixes: https://github.com/axboe/liburing/issues/402
77
+ Signed-off-by: Jens Axboe <axboe@kernel.dk>
78
+ ```
79
+
80
+ </details>
81
+
82
+ ----
83
+ ## By submitting this pull request, I acknowledge that:
84
+ 1. I have followed the above pull request guidelines.
85
+ 2. I have the rights to submit this work under the same license.
86
+ 3. I agree to a Developer Certificate of Origin (see https://developercertificate.org for more information).
@@ -0,0 +1,137 @@
1
+ name: Build test
2
+
3
+ on:
4
+ # Trigger the workflow on push or pull requests.
5
+ push:
6
+ pull_request:
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-22.04
11
+
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ include:
16
+ # x86-64 gcc
17
+ - arch: x86_64
18
+ cc_pkg: gcc-x86-64-linux-gnu
19
+ cxx_pkg: g++-x86-64-linux-gnu
20
+ cc: x86_64-linux-gnu-gcc
21
+ cxx: x86_64-linux-gnu-g++
22
+
23
+ # x86-64 clang
24
+ - arch: x86_64
25
+ cc_pkg: clang
26
+ cxx_pkg: clang
27
+ cc: clang
28
+ cxx: clang++
29
+ liburing_extra_flags: -Wshorten-64-to-32
30
+ extra_flags: -Wmissing-prototypes -Wstrict-prototypes -Wunreachable-code-loop-increment -Wunreachable-code -Wmissing-variable-declarations -Wextra-semi-stmt
31
+
32
+ # x86 (32-bit) gcc
33
+ - arch: i686
34
+ cc_pkg: gcc-i686-linux-gnu
35
+ cxx_pkg: g++-i686-linux-gnu
36
+ cc: i686-linux-gnu-gcc
37
+ cxx: i686-linux-gnu-g++
38
+
39
+ # aarch64 gcc
40
+ - arch: aarch64
41
+ cc_pkg: gcc-aarch64-linux-gnu
42
+ cxx_pkg: g++-aarch64-linux-gnu
43
+ cc: aarch64-linux-gnu-gcc
44
+ cxx: aarch64-linux-gnu-g++
45
+
46
+ # arm (32-bit) gcc
47
+ - arch: arm
48
+ cc_pkg: gcc-arm-linux-gnueabi
49
+ cxx_pkg: g++-arm-linux-gnueabi
50
+ cc: arm-linux-gnueabi-gcc
51
+ cxx: arm-linux-gnueabi-g++
52
+
53
+ # riscv64
54
+ - arch: riscv64
55
+ cc_pkg: gcc-riscv64-linux-gnu
56
+ cxx_pkg: g++-riscv64-linux-gnu
57
+ cc: riscv64-linux-gnu-gcc
58
+ cxx: riscv64-linux-gnu-g++
59
+
60
+ # powerpc64
61
+ - arch: powerpc64
62
+ cc_pkg: gcc-powerpc64-linux-gnu
63
+ cxx_pkg: g++-powerpc64-linux-gnu
64
+ cc: powerpc64-linux-gnu-gcc
65
+ cxx: powerpc64-linux-gnu-g++
66
+
67
+ # powerpc
68
+ - arch: powerpc
69
+ cc_pkg: gcc-powerpc-linux-gnu
70
+ cxx_pkg: g++-powerpc-linux-gnu
71
+ cc: powerpc-linux-gnu-gcc
72
+ cxx: powerpc-linux-gnu-g++
73
+
74
+ # alpha
75
+ - arch: alpha
76
+ cc_pkg: gcc-alpha-linux-gnu
77
+ cxx_pkg: g++-alpha-linux-gnu
78
+ cc: alpha-linux-gnu-gcc
79
+ cxx: alpha-linux-gnu-g++
80
+
81
+ # mips64
82
+ - arch: mips64
83
+ cc_pkg: gcc-mips64-linux-gnuabi64
84
+ cxx_pkg: g++-mips64-linux-gnuabi64
85
+ cc: mips64-linux-gnuabi64-gcc
86
+ cxx: mips64-linux-gnuabi64-g++
87
+
88
+ # mips
89
+ - arch: mips
90
+ cc_pkg: gcc-mips-linux-gnu
91
+ cxx_pkg: g++-mips-linux-gnu
92
+ cc: mips-linux-gnu-gcc
93
+ cxx: mips-linux-gnu-g++
94
+
95
+ # hppa
96
+ - arch: hppa
97
+ cc_pkg: gcc-hppa-linux-gnu
98
+ cxx_pkg: g++-hppa-linux-gnu
99
+ cc: hppa-linux-gnu-gcc
100
+ cxx: hppa-linux-gnu-g++
101
+
102
+ env:
103
+ FLAGS: -g -O3 -Wall -Wextra -Werror -Wno-sign-compare ${{matrix.extra_flags}}
104
+
105
+ # Flags for building sources in src/ dir only.
106
+ LIBURING_CFLAGS: ${{matrix.liburing_extra_flags}}
107
+
108
+ steps:
109
+ - name: Checkout source
110
+ uses: actions/checkout@v4
111
+
112
+ - name: Install Compilers
113
+ run: |
114
+ if [[ "${{matrix.cc_pkg}}" == "clang" ]]; then \
115
+ wget https://apt.llvm.org/llvm.sh -O /tmp/llvm.sh; \
116
+ sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 -y; \
117
+ sudo bash /tmp/llvm.sh 17; \
118
+ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-17 400; \
119
+ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 400; \
120
+ else \
121
+ sudo apt-get update -y; \
122
+ sudo apt-get install -y ${{matrix.cc_pkg}} ${{matrix.cxx_pkg}}; \
123
+ fi;
124
+
125
+ - name: Display compiler versions
126
+ run: |
127
+ ${{matrix.cc}} --version;
128
+ ${{matrix.cxx}} --version;
129
+
130
+ - name: Build
131
+ run: |
132
+ ./configure --cc=${{matrix.cc}} --cxx=${{matrix.cxx}};
133
+ make -j$(nproc) V=1 CPPFLAGS="-Werror" CFLAGS="$FLAGS" CXXFLAGS="$FLAGS";
134
+
135
+ - name: Test install command
136
+ run: |
137
+ sudo make install;
@@ -0,0 +1,25 @@
1
+ name: Codespell
2
+
3
+ on:
4
+ # Trigger the workflow on push or pull requests.
5
+ push:
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-24.04
11
+
12
+ steps:
13
+ - name: Checkout source
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Install codespell
17
+ run: |
18
+ sudo apt-get update -y
19
+ sudo apt-get install -y codespell
20
+
21
+ - name: Display codespell version
22
+ run: codespell --version
23
+
24
+ - name: Execute codespell
25
+ run: codespell --ignore-words=.github/actions/codespell/stopwords .
@@ -0,0 +1,20 @@
1
+ name: Shellcheck
2
+
3
+ on:
4
+ # Trigger the workflow on push or pull requests.
5
+ push:
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-22.04
11
+
12
+ steps:
13
+ - name: Checkout source
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Display shellcheck version
17
+ run: shellcheck --version
18
+
19
+ - name: Shellcheck execution
20
+ run: shellcheck test/runtest*.sh
@@ -0,0 +1,41 @@
1
+ *.rej
2
+ *.orig
3
+ *~
4
+ /*.patch
5
+
6
+ *.d
7
+ *.o
8
+ *.o[ls]
9
+
10
+ /src/liburing.a
11
+ /src/liburing.so*
12
+ /src/liburing-ffi.a
13
+ /src/liburing-ffi.so*
14
+ /src/include/liburing/compat.h
15
+ /src/include/liburing/io_uring_version.h
16
+
17
+ /examples/io_uring-close-test
18
+ /examples/io_uring-cp
19
+ /examples/io_uring-test
20
+ /examples/io_uring-udp
21
+ /examples/link-cp
22
+ /examples/napi-busy-poll-client
23
+ /examples/napi-busy-poll-server
24
+ /examples/ucontext-cp
25
+ /examples/poll-bench
26
+ /examples/proxy
27
+ /examples/send-zerocopy
28
+ /examples/rsrc-update-bench
29
+
30
+ /test/*.t
31
+ /test/*.dmesg
32
+ /test/output/
33
+
34
+ config-host.h
35
+ config-host.mak
36
+ config.log
37
+
38
+ liburing.pc
39
+ liburing-ffi.pc
40
+
41
+ cscope.out
@@ -0,0 +1,111 @@
1
+ liburing-2.7 release
2
+
3
+ - Man page updates
4
+ - Sync with kernel 6.10
5
+ - send/recv bundle support
6
+ - accept nowait and CQE_F_MORE
7
+ - Add and update test cases
8
+ - Fix io_uring_queue_init_mem() returning a value that was too small,
9
+ potentially causing memory corruption in userspace by overwriting
10
+ 64 bytes beyond the returned value. Also add test case for that.
11
+ - Add 64-bit length variants of io_uring_prep_{m,f}advise()
12
+ - Add BIND/LISTEN support and helpers / man pages
13
+ - Add io_uring_enable_rings.3 man page
14
+ - Fix bug in io_uring_prep_read_multishot()
15
+ - Fixup bundle test cases
16
+ - Add fixed-hugepage test case
17
+ - Fix io_uring_prep_fixed_fd_install.3 man page
18
+ - Note 'len' == 0 requirement in io_uring_prep_send.3 man page
19
+ - Fix some test cases for skipping on older kernels
20
+
21
+ liburing-2.6 release
22
+
23
+ - Add getsockopt and setsockopt socket commands
24
+ - Add test cases to test/hardlink
25
+ - Man page fixes
26
+ - Add futex support, and test cases
27
+ - Add waitid support, and test cases
28
+ - Add read multishot, and test cases
29
+ - Add support for IORING_SETUP_NO_SQARRAY
30
+ - Use IORING_SETUP_NO_SQARRAY as the default
31
+ - Add support for IORING_OP_FIXED_FD_INSTALL
32
+ - Add io_uring_prep_fixed_fd_install() helper
33
+ - Support for napi busy polling
34
+ - Improve/add test cases
35
+ - Man page fixes
36
+ - Add sample 'proxy' example
37
+
38
+ liburing-2.5 release
39
+
40
+ - Add support for io_uring_prep_cmd_sock()
41
+ - Add support for application allocated ring memory, for placing rings
42
+ in huge mem. Available through io_uring_queue_init_mem().
43
+ - Add support for registered ring fds
44
+ - Various documentation updates
45
+ - Various fixes
46
+
47
+ liburing-2.4 release
48
+
49
+ - Add io_uring_{major,minor,check}_version() functions.
50
+ - Add IO_URING_{MAJOR,MINOR,CHECK}_VERSION() macros.
51
+ - FFI support (for non-C/C++ languages integration).
52
+ - Add io_uring_prep_msg_ring_cqe_flags() function.
53
+ - Deprecate --nolibc configure option.
54
+ - CONFIG_NOLIBC is always enabled on x86-64, x86, and aarch64.
55
+ - Add support for IORING_REGISTER_USE_REGISTERED_RING and use if available.
56
+ - Add io_uring_close_ring_fd() function.
57
+ - Add io_uring_prep_msg_ring_fd_alloc function.
58
+ - Add io_uring_free_buf_ring() and io_uring_setup_buf_ring() functions.
59
+ - Ensure that io_uring_prep_accept_direct(), io_uring_prep_openat_direct(),
60
+ io_uring_prep_openat2_direct(), io_uring_prep_msg_ring_fd(), and
61
+ io_uring_prep_socket_direct() factor in being called with
62
+ IORING_FILE_INDEX_ALLOC for allocating a direct descriptor.
63
+ - Add io_uring_prep_sendto() function.
64
+ - Add io_uring_prep_cmd_sock() function.
65
+
66
+ liburing-2.3 release
67
+
68
+ - Support non-libc build for aarch64.
69
+ - Add io_uring_{enter,enter2,register,setup} syscall functions.
70
+ - Add sync cancel interface, io_uring_register_sync_cancel().
71
+ - Fix return value of io_uring_submit_and_wait_timeout() to match the
72
+ man page.
73
+ - Improvements to the regression tests
74
+ - Add support and test case for passthrough IO
75
+ - Add recv and recvmsg multishot helpers and support
76
+ - Add documentation and support for IORING_SETUP_DEFER_TASKRUN
77
+ - Fix potential missing kernel entry with IORING_SETUP_IOPOLL
78
+ - Add support and documentation for zero-copy network transmit
79
+ - Various optimizations
80
+ - Many cleanups
81
+ - Many man page additions and updates
82
+
83
+ liburing-2.2 release
84
+
85
+ - Support non-libc builds.
86
+ - Optimized syscall handling for x86-64/x86/aarch64.
87
+ - Enable non-lib function calls for fast path functions.
88
+ - Add support for multishot accept.
89
+ - io_uring_register_files() will set RLIMIT_NOFILE if necessary.
90
+ - Add support for registered ring fds, io_uring_register_ring_fd(),
91
+ reducing the overhead of an io_uring_enter() system call.
92
+ - Add support for the message ring opcode.
93
+ - Add support for newer request cancelation features.
94
+ - Add support for IORING_SETUP_COOP_TASKRUN, which can help reduce the
95
+ overhead of io_uring in general. Most applications should set this flag,
96
+ see the io_uring_setup.2 man page for details.
97
+ - Add support for registering a sparse buffer and file set.
98
+ - Add support for a new buffer provide scheme, see
99
+ io_uring_register_buf_ring.3 for details.
100
+ - Add io_uring_submit_and_wait_timeout() for submitting IO and waiting
101
+ for completions with a timeout.
102
+ - Add io_uring_prep_{read,write}v2 prep helpers.
103
+ - Add io_uring_prep_close_direct() helper.
104
+ - Add support for SQE128 and CQE32, which are doubly sized SQE and CQE
105
+ rings. This is needed for some cases of the new IORING_OP_URING_CMD,
106
+ notably for NVMe passthrough.
107
+ - ~5500 lines of man page additions, including adding ~90 new man pages.
108
+ - Synced with the 5.19 kernel release, supporting all the features of
109
+ 5.19 and earlier.
110
+ - 24 new regression test cases, and ~7000 lines of new tests in general.
111
+ - General optimizations and fixes.
@@ -0,0 +1,11 @@
1
+ cff-version: 1.2.0
2
+ preferred-citation:
3
+ type: software
4
+ authors:
5
+ - family-names: "Axboe"
6
+ given-names: "Jens"
7
+ email: axboe@kernel.dk
8
+ title: "liburing library for io_uring"
9
+ year: 2022
10
+ url: "https://github.com/axboe/liburing"
11
+ licence: MIT