uringmachine 0.24.0 → 0.25.0

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 (274) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +0 -3
  4. data/CHANGELOG.md +9 -0
  5. data/Gemfile +11 -0
  6. data/README.md +266 -112
  7. data/Rakefile +8 -0
  8. data/TODO.md +0 -17
  9. data/benchmark/common.rb +2 -0
  10. data/benchmark/openssl.rb +77 -0
  11. data/benchmark/openssl_socketpair.rb +112 -0
  12. data/benchmark/sqlite.rb +1 -1
  13. data/docs/design/buffer_pool.md +1 -1
  14. data/ext/um/extconf.rb +15 -0
  15. data/ext/um/um.c +18 -2
  16. data/ext/um/um.h +7 -2
  17. data/ext/um/um_async_op_class.c +31 -0
  18. data/ext/um/um_class.c +705 -19
  19. data/ext/um/um_const.c +31 -0
  20. data/ext/um/um_mutex_class.c +12 -0
  21. data/ext/um/um_queue_class.c +16 -0
  22. data/ext/um/um_ssl.c +109 -0
  23. data/ext/um/um_stream.c +9 -8
  24. data/ext/um/um_utils.c +3 -4
  25. data/grant-2025/interim-report.md +1 -1
  26. data/grant-2025/journal.md +4 -4
  27. data/grant-2025/tasks.md +6 -4
  28. data/lib/uringmachine/dns_resolver.rb +38 -0
  29. data/lib/uringmachine/fiber_scheduler.rb +7 -5
  30. data/lib/uringmachine/version.rb +1 -1
  31. data/lib/uringmachine.rb +106 -6
  32. data/test/helper.rb +15 -0
  33. data/test/test_fiber_scheduler.rb +37 -0
  34. data/test/test_ssl.rb +85 -0
  35. data/test/test_stream.rb +11 -0
  36. data/test/test_um.rb +156 -2
  37. data/uringmachine.gemspec +1 -7
  38. data/vendor/liburing/examples/send-zerocopy.c +43 -31
  39. data/vendor/liburing/examples/zcrx.c +260 -69
  40. data/vendor/liburing/liburing.spec +1 -1
  41. data/vendor/liburing/src/include/liburing/io_uring.h +12 -0
  42. data/vendor/liburing/src/include/liburing.h +3 -2
  43. data/vendor/liburing/src/liburing-ffi.map +4 -0
  44. data/vendor/liburing/src/liburing.map +4 -0
  45. data/vendor/liburing/src/queue.c +12 -0
  46. data/vendor/liburing/src/register.c +1 -0
  47. data/vendor/liburing/src/setup.c +15 -7
  48. data/vendor/liburing/test/Makefile +8 -4
  49. data/vendor/liburing/test/conn-unreach.c +1 -1
  50. data/vendor/liburing/test/epwait.c +32 -6
  51. data/vendor/liburing/test/io-wq-exit.c +131 -0
  52. data/vendor/liburing/test/iowait.c +1 -1
  53. data/vendor/liburing/test/min-timeout.c +3 -1
  54. data/vendor/liburing/test/open-close.c +39 -0
  55. data/vendor/liburing/test/poll-update-trigger.c +85 -0
  56. data/vendor/liburing/test/recvsend_bundle.c +14 -11
  57. data/vendor/liburing/test/sendzc-bug.c +146 -0
  58. data/vendor/liburing/test/sqe-mixed-nop.c +151 -7
  59. data/vendor/liburing/test/test.h +2 -0
  60. data/vendor/liburing/test/timestamp-bug.c +135 -0
  61. data/vendor/liburing/test/timestamp.c +5 -0
  62. data/vendor/liburing/test/vec-regbuf.c +136 -1
  63. metadata +37 -283
  64. data/vendor/libressl/.github/scripts/changelog.sh +0 -74
  65. data/vendor/libressl/.github/workflows/android.yml +0 -35
  66. data/vendor/libressl/.github/workflows/cifuzz.yml +0 -33
  67. data/vendor/libressl/.github/workflows/cmake-config.yml +0 -98
  68. data/vendor/libressl/.github/workflows/coverity.yml +0 -69
  69. data/vendor/libressl/.github/workflows/emscripten.yml +0 -71
  70. data/vendor/libressl/.github/workflows/fedora-rawhide.yml +0 -39
  71. data/vendor/libressl/.github/workflows/freebsd.yml +0 -71
  72. data/vendor/libressl/.github/workflows/linux.yml +0 -71
  73. data/vendor/libressl/.github/workflows/macos.yml +0 -37
  74. data/vendor/libressl/.github/workflows/release.yml +0 -81
  75. data/vendor/libressl/.github/workflows/rust-openssl.yml +0 -47
  76. data/vendor/libressl/.github/workflows/solaris.yml +0 -37
  77. data/vendor/libressl/.github/workflows/windows.yml +0 -70
  78. data/vendor/libressl/.gitignore +0 -333
  79. data/vendor/libressl/CMakeLists.txt +0 -581
  80. data/vendor/libressl/COPYING +0 -133
  81. data/vendor/libressl/ChangeLog +0 -3280
  82. data/vendor/libressl/FindLibreSSL.cmake +0 -232
  83. data/vendor/libressl/LibreSSLConfig.cmake.in +0 -36
  84. data/vendor/libressl/Makefile.am +0 -60
  85. data/vendor/libressl/Makefile.am.common +0 -20
  86. data/vendor/libressl/OPENBSD_BRANCH +0 -1
  87. data/vendor/libressl/README.md +0 -238
  88. data/vendor/libressl/README.mingw.md +0 -43
  89. data/vendor/libressl/apps/CMakeLists.txt +0 -18
  90. data/vendor/libressl/apps/Makefile.am +0 -5
  91. data/vendor/libressl/apps/nc/CMakeLists.txt +0 -67
  92. data/vendor/libressl/apps/nc/Makefile.am +0 -64
  93. data/vendor/libressl/apps/nc/compat/accept4.c +0 -17
  94. data/vendor/libressl/apps/nc/compat/readpassphrase.c +0 -205
  95. data/vendor/libressl/apps/nc/compat/socket.c +0 -29
  96. data/vendor/libressl/apps/nc/compat/sys/socket.h +0 -30
  97. data/vendor/libressl/apps/ocspcheck/CMakeLists.txt +0 -44
  98. data/vendor/libressl/apps/ocspcheck/Makefile.am +0 -45
  99. data/vendor/libressl/apps/ocspcheck/compat/.gitignore +0 -0
  100. data/vendor/libressl/apps/openssl/CMakeLists.txt +0 -97
  101. data/vendor/libressl/apps/openssl/Makefile.am +0 -108
  102. data/vendor/libressl/apps/openssl/apps_win.c +0 -138
  103. data/vendor/libressl/apps/openssl/certhash_win.c +0 -13
  104. data/vendor/libressl/apps/openssl/compat/clock_gettime_osx.c +0 -26
  105. data/vendor/libressl/apps/openssl/compat/poll_win.c +0 -329
  106. data/vendor/libressl/appveyor.yml +0 -53
  107. data/vendor/libressl/autogen.sh +0 -15
  108. data/vendor/libressl/check-release.sh +0 -86
  109. data/vendor/libressl/cmake_export_symbol.cmake +0 -71
  110. data/vendor/libressl/cmake_uninstall.cmake.in +0 -36
  111. data/vendor/libressl/config +0 -17
  112. data/vendor/libressl/configure.ac +0 -165
  113. data/vendor/libressl/crypto/CMakeLists.txt +0 -863
  114. data/vendor/libressl/crypto/Makefile.am +0 -962
  115. data/vendor/libressl/crypto/Makefile.am.arc4random +0 -46
  116. data/vendor/libressl/crypto/Makefile.am.elf-mips +0 -14
  117. data/vendor/libressl/crypto/Makefile.am.elf-mips64 +0 -14
  118. data/vendor/libressl/crypto/Makefile.am.elf-x86_64 +0 -35
  119. data/vendor/libressl/crypto/Makefile.am.macosx-x86_64 +0 -35
  120. data/vendor/libressl/crypto/Makefile.am.masm-x86_64 +0 -22
  121. data/vendor/libressl/crypto/Makefile.am.mingw64-x86_64 +0 -23
  122. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_darwin.c +0 -60
  123. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_linux.c +0 -62
  124. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_none.c +0 -26
  125. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_windows.c +0 -36
  126. data/vendor/libressl/crypto/arch/loongarch64/crypto_arch.h +0 -21
  127. data/vendor/libressl/crypto/arch/mips/crypto_arch.h +0 -21
  128. data/vendor/libressl/crypto/bn/arch/loongarch64/bn_arch.h +0 -23
  129. data/vendor/libressl/crypto/bn/arch/mips/bn_arch.h +0 -24
  130. data/vendor/libressl/crypto/compat/.gitignore +0 -31
  131. data/vendor/libressl/crypto/compat/arc4random.h +0 -41
  132. data/vendor/libressl/crypto/compat/b_win.c +0 -55
  133. data/vendor/libressl/crypto/compat/bsd-asprintf.c +0 -96
  134. data/vendor/libressl/crypto/compat/crypto_lock_win.c +0 -56
  135. data/vendor/libressl/crypto/compat/explicit_bzero_win.c +0 -13
  136. data/vendor/libressl/crypto/compat/freezero.c +0 -32
  137. data/vendor/libressl/crypto/compat/getdelim.c +0 -78
  138. data/vendor/libressl/crypto/compat/getline.c +0 -40
  139. data/vendor/libressl/crypto/compat/getopt_long.c +0 -528
  140. data/vendor/libressl/crypto/compat/getpagesize.c +0 -18
  141. data/vendor/libressl/crypto/compat/getprogname_linux.c +0 -23
  142. data/vendor/libressl/crypto/compat/getprogname_unimpl.c +0 -7
  143. data/vendor/libressl/crypto/compat/getprogname_windows.c +0 -13
  144. data/vendor/libressl/crypto/compat/posix_win.c +0 -296
  145. data/vendor/libressl/crypto/compat/syslog_r.c +0 -19
  146. data/vendor/libressl/crypto/compat/ui_openssl_win.c +0 -334
  147. data/vendor/libressl/dist.sh +0 -22
  148. data/vendor/libressl/gen-coverage-report.sh +0 -58
  149. data/vendor/libressl/gen-openbsd-tags.sh +0 -20
  150. data/vendor/libressl/include/CMakeLists.txt +0 -61
  151. data/vendor/libressl/include/Makefile.am +0 -79
  152. data/vendor/libressl/include/arch/loongarch64/opensslconf.h +0 -150
  153. data/vendor/libressl/include/arch/mips/opensslconf.h +0 -150
  154. data/vendor/libressl/include/compat/arpa/inet.h +0 -15
  155. data/vendor/libressl/include/compat/arpa/nameser.h +0 -25
  156. data/vendor/libressl/include/compat/cet.h +0 -19
  157. data/vendor/libressl/include/compat/dirent.h +0 -17
  158. data/vendor/libressl/include/compat/dirent_msvc.h +0 -611
  159. data/vendor/libressl/include/compat/endian.h +0 -161
  160. data/vendor/libressl/include/compat/err.h +0 -95
  161. data/vendor/libressl/include/compat/fcntl.h +0 -32
  162. data/vendor/libressl/include/compat/getopt.h +0 -50
  163. data/vendor/libressl/include/compat/limits.h +0 -25
  164. data/vendor/libressl/include/compat/netdb.h +0 -10
  165. data/vendor/libressl/include/compat/netinet/in.h +0 -19
  166. data/vendor/libressl/include/compat/netinet/ip.h +0 -49
  167. data/vendor/libressl/include/compat/netinet/tcp.h +0 -10
  168. data/vendor/libressl/include/compat/poll.h +0 -63
  169. data/vendor/libressl/include/compat/pthread.h +0 -122
  170. data/vendor/libressl/include/compat/readpassphrase.h +0 -44
  171. data/vendor/libressl/include/compat/resolv.h +0 -24
  172. data/vendor/libressl/include/compat/stdint.h +0 -31
  173. data/vendor/libressl/include/compat/stdio.h +0 -65
  174. data/vendor/libressl/include/compat/stdlib.h +0 -57
  175. data/vendor/libressl/include/compat/string.h +0 -98
  176. data/vendor/libressl/include/compat/sys/_null.h +0 -18
  177. data/vendor/libressl/include/compat/sys/ioctl.h +0 -11
  178. data/vendor/libressl/include/compat/sys/mman.h +0 -19
  179. data/vendor/libressl/include/compat/sys/param.h +0 -15
  180. data/vendor/libressl/include/compat/sys/queue.h +0 -536
  181. data/vendor/libressl/include/compat/sys/select.h +0 -10
  182. data/vendor/libressl/include/compat/sys/socket.h +0 -18
  183. data/vendor/libressl/include/compat/sys/stat.h +0 -129
  184. data/vendor/libressl/include/compat/sys/time.h +0 -37
  185. data/vendor/libressl/include/compat/sys/tree.h +0 -1006
  186. data/vendor/libressl/include/compat/sys/types.h +0 -69
  187. data/vendor/libressl/include/compat/sys/uio.h +0 -17
  188. data/vendor/libressl/include/compat/syslog.h +0 -38
  189. data/vendor/libressl/include/compat/time.h +0 -59
  190. data/vendor/libressl/include/compat/unistd.h +0 -83
  191. data/vendor/libressl/include/compat/win32netcompat.h +0 -57
  192. data/vendor/libressl/include/openssl/Makefile.am.tpl +0 -45
  193. data/vendor/libressl/libcrypto.pc.in +0 -28
  194. data/vendor/libressl/libressl.pub +0 -2
  195. data/vendor/libressl/libssl.pc.in +0 -28
  196. data/vendor/libressl/libtls.pc.in +0 -28
  197. data/vendor/libressl/m4/ax_add_fortify_source.m4 +0 -80
  198. data/vendor/libressl/m4/ax_check_compile_flag.m4 +0 -53
  199. data/vendor/libressl/m4/check-hardening-options.m4 +0 -110
  200. data/vendor/libressl/m4/check-libc.m4 +0 -189
  201. data/vendor/libressl/m4/check-os-options.m4 +0 -181
  202. data/vendor/libressl/m4/disable-compiler-warnings.m4 +0 -44
  203. data/vendor/libressl/man/CMakeLists.txt +0 -26
  204. data/vendor/libressl/man/links +0 -2780
  205. data/vendor/libressl/man/update_links.sh +0 -25
  206. data/vendor/libressl/openssl.pc.in +0 -11
  207. data/vendor/libressl/patches/bn_shift.patch +0 -34
  208. data/vendor/libressl/patches/crypto_arch.h.patch +0 -34
  209. data/vendor/libressl/patches/crypto_namespace.h.patch +0 -22
  210. data/vendor/libressl/patches/netcat.c.patch +0 -178
  211. data/vendor/libressl/patches/openssl.c.patch +0 -12
  212. data/vendor/libressl/patches/opensslfeatures.h.patch +0 -49
  213. data/vendor/libressl/patches/patch-amd64-crypto-cpu-caps.c.patch +0 -20
  214. data/vendor/libressl/patches/patch-i386-crypto-cpu-caps.c.patch +0 -20
  215. data/vendor/libressl/patches/speed.c.patch +0 -114
  216. data/vendor/libressl/patches/ssl_namespace.h.patch +0 -21
  217. data/vendor/libressl/patches/tls.h.patch +0 -16
  218. data/vendor/libressl/patches/tls_config.c.patch +0 -15
  219. data/vendor/libressl/patches/win32_amd64_bn_arch.h.patch +0 -28
  220. data/vendor/libressl/patches/windows_headers.patch +0 -80
  221. data/vendor/libressl/scripts/config.guess +0 -1774
  222. data/vendor/libressl/scripts/config.sub +0 -1907
  223. data/vendor/libressl/scripts/i686-w64-mingw32.cmake +0 -9
  224. data/vendor/libressl/scripts/test +0 -210
  225. data/vendor/libressl/scripts/wrap-compiler-for-flag-check +0 -31
  226. data/vendor/libressl/scripts/x86_64-w64-mingw32.cmake +0 -9
  227. data/vendor/libressl/ssl/CMakeLists.txt +0 -183
  228. data/vendor/libressl/ssl/Makefile.am +0 -187
  229. data/vendor/libressl/tests/CMakeLists.txt +0 -970
  230. data/vendor/libressl/tests/Makefile.am +0 -944
  231. data/vendor/libressl/tests/aeadtest.sh +0 -30
  232. data/vendor/libressl/tests/arc4randomforktest.sh +0 -21
  233. data/vendor/libressl/tests/asn1time_small.test +0 -10
  234. data/vendor/libressl/tests/cmake/CMakeLists.txt +0 -52
  235. data/vendor/libressl/tests/cmake/crypto.c +0 -7
  236. data/vendor/libressl/tests/cmake/ssl.c +0 -6
  237. data/vendor/libressl/tests/cmake/tls.c +0 -6
  238. data/vendor/libressl/tests/compat/pipe2.c +0 -186
  239. data/vendor/libressl/tests/dtlstest.sh +0 -28
  240. data/vendor/libressl/tests/evptest.sh +0 -22
  241. data/vendor/libressl/tests/keypairtest.sh +0 -27
  242. data/vendor/libressl/tests/mlkem_tests.sh +0 -39
  243. data/vendor/libressl/tests/ocsptest.bat +0 -25
  244. data/vendor/libressl/tests/ocsptest.sh +0 -23
  245. data/vendor/libressl/tests/openssl.cnf +0 -29
  246. data/vendor/libressl/tests/optionstest.c +0 -381
  247. data/vendor/libressl/tests/pidwraptest.c +0 -85
  248. data/vendor/libressl/tests/pidwraptest.sh +0 -26
  249. data/vendor/libressl/tests/quictest.bat +0 -27
  250. data/vendor/libressl/tests/quictest.sh +0 -30
  251. data/vendor/libressl/tests/renegotiation_test.bat +0 -27
  252. data/vendor/libressl/tests/renegotiation_test.sh +0 -30
  253. data/vendor/libressl/tests/rfc5280time_small.test +0 -10
  254. data/vendor/libressl/tests/servertest.bat +0 -27
  255. data/vendor/libressl/tests/servertest.sh +0 -30
  256. data/vendor/libressl/tests/shutdowntest.bat +0 -27
  257. data/vendor/libressl/tests/shutdowntest.sh +0 -30
  258. data/vendor/libressl/tests/ssltest.bat +0 -32
  259. data/vendor/libressl/tests/ssltest.sh +0 -48
  260. data/vendor/libressl/tests/testdsa.bat +0 -47
  261. data/vendor/libressl/tests/testdsa.sh +0 -57
  262. data/vendor/libressl/tests/testenc.bat +0 -85
  263. data/vendor/libressl/tests/testenc.sh +0 -93
  264. data/vendor/libressl/tests/testrsa.bat +0 -47
  265. data/vendor/libressl/tests/testrsa.sh +0 -57
  266. data/vendor/libressl/tests/testssl.bat +0 -171
  267. data/vendor/libressl/tests/tlstest.bat +0 -27
  268. data/vendor/libressl/tests/tlstest.sh +0 -28
  269. data/vendor/libressl/tls/CMakeLists.txt +0 -125
  270. data/vendor/libressl/tls/Makefile.am +0 -76
  271. data/vendor/libressl/tls/compat/ftruncate.c +0 -17
  272. data/vendor/libressl/tls/compat/pread.c +0 -29
  273. data/vendor/libressl/tls/compat/pwrite.c +0 -29
  274. data/vendor/libressl/update.sh +0 -460
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/inline'
4
+
5
+ gemfile do
6
+ source 'https://rubygems.org'
7
+ gem 'uringmachine', path: '..'
8
+ gem 'benchmark'
9
+ gem 'io-event'
10
+ gem 'async'
11
+ gem 'pg'
12
+ gem 'gvltools'
13
+ gem 'openssl'
14
+ gem 'localhost'
15
+ end
16
+
17
+ require 'uringmachine/fiber_scheduler'
18
+ require 'socket'
19
+ require 'openssl'
20
+ require 'localhost/authority'
21
+
22
+ GROUPS = 48
23
+ ITERATIONS = 10000
24
+
25
+ SIZE = 1 << 14
26
+ DATA = '*' * SIZE
27
+
28
+ AUTHORITY = Localhost::Authority.fetch
29
+
30
+ def do_io(um)
31
+ GROUPS.times do
32
+ r, w = Socket.socketpair(:AF_UNIX, :SOCK_STREAM, 0)
33
+ r.sync = true
34
+ w.sync = true
35
+ ctx = AUTHORITY.server_context
36
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+ s1 = OpenSSL::SSL::SSLSocket.new(r, ctx)
38
+ s1.sync_close = true
39
+ um.ssl_set_bio(s1) if um
40
+ Fiber.schedule do
41
+ s1.accept
42
+ ITERATIONS.times { s1.readpartial(SIZE) }
43
+ s1.close rescue nil
44
+ rescue => e
45
+ p e
46
+ p e.backtrace
47
+ end
48
+
49
+ s2 = OpenSSL::SSL::SSLSocket.new(w, OpenSSL::SSL::SSLContext.new)
50
+ s2.sync_close = true
51
+ um.ssl_set_bio(s2) if um
52
+ Fiber.schedule do
53
+ s2.connect
54
+ ITERATIONS.times { s2.write(DATA) }
55
+ s2.close rescue nil
56
+ rescue => e
57
+ p e
58
+ p e.backtrace
59
+ end
60
+ end
61
+ end
62
+
63
+ def do_um_io(um)
64
+ GROUPS.times do
65
+ r, w = Socket.socketpair(:AF_UNIX, :SOCK_STREAM, 0)
66
+ r.sync = true
67
+ w.sync = true
68
+ ctx = AUTHORITY.server_context
69
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
70
+ s1 = OpenSSL::SSL::SSLSocket.new(r, ctx)
71
+ s1.sync_close = true
72
+ um.ssl_set_bio(s1)
73
+ Fiber.schedule do
74
+ s1.accept
75
+ ITERATIONS.times { um.ssl_read(s1, +'', SIZE) }
76
+ s1.close rescue nil
77
+ rescue => e
78
+ p e
79
+ p e.backtrace
80
+ end
81
+
82
+ s2 = OpenSSL::SSL::SSLSocket.new(w, OpenSSL::SSL::SSLContext.new)
83
+ s2.sync_close = true
84
+ um.ssl_set_bio(s2)
85
+ Fiber.schedule do
86
+ s2.connect
87
+ ITERATIONS.times { um.ssl_write(s2, DATA, DATA.bytesize) }
88
+ s2.close rescue nil
89
+ rescue => e
90
+ p e
91
+ p e.backtrace
92
+ end
93
+ end
94
+ end
95
+
96
+ def run(custom_bio, um_io)
97
+ machine = UM.new
98
+ scheduler = UM::FiberScheduler.new(machine)
99
+ Fiber.set_scheduler(scheduler)
100
+ if um_io
101
+ do_um_io(machine)
102
+ else
103
+ do_io(custom_bio ? machine : nil)
104
+ end
105
+ scheduler.join
106
+ end
107
+
108
+ Benchmark.bm do |b|
109
+ b.report("stock") { run(false, false) }
110
+ b.report("UM BIO") { run(true, false) }
111
+ b.report("UM I/O") { run(true, true) }
112
+ end
data/benchmark/sqlite.rb CHANGED
@@ -36,7 +36,7 @@ class DBActor2
36
36
  rescue Exception => e
37
37
  # handle unhandled exceptions
38
38
  ensure
39
- @machine.fiber_map.delete(self)
39
+ @machine.fiber_set.delete(self)
40
40
  @machine.yield
41
41
  end
42
42
 
@@ -37,7 +37,7 @@ buffers, to using managed buffers from the buffer pool.
37
37
  is used to interact with the data read/received as it becomes available. The
38
38
  stream instance methods may block until enough data is available in the
39
39
  relevant buffers.
40
-
40
+
41
41
  Example:
42
42
 
43
43
  ```ruby
data/ext/um/extconf.rb CHANGED
@@ -54,6 +54,21 @@ if !find_library('uring', nil, File.join(liburing_path, 'src'))
54
54
  raise "Couldn't find liburing.a"
55
55
  end
56
56
 
57
+ if !have_header("openssl/ssl.h")
58
+ raise "Couldn't find OpenSSL headers"
59
+ end
60
+
61
+ if !have_library("ssl", "SSL_new")
62
+ raise "Couldn't find OpenSSL library"
63
+ end
64
+
65
+ version_ok = checking_for("OpenSSL version >= 1.1.1") {
66
+ try_static_assert("OPENSSL_VERSION_NUMBER >= 0x10101000L", "openssl/opensslv.h")
67
+ }
68
+ unless version_ok
69
+ raise "OpenSSL >= 1.1.1 or LibreSSL >= 3.9.0 is required"
70
+ end
71
+
57
72
  have_func("&rb_process_status_new")
58
73
 
59
74
  $defs << "-DUM_KERNEL_VERSION=#{config[:kernel_version]}"
data/ext/um/um.c CHANGED
@@ -530,7 +530,7 @@ VALUE um_read(struct um *machine, int fd, VALUE buffer, size_t maxlen, ssize_t b
530
530
  VALUE ret = um_yield(machine);
531
531
 
532
532
  if (um_check_completion(machine, &op)) {
533
- um_update_read_buffer(machine, buffer, buffer_offset, op.result.res, op.result.flags);
533
+ um_update_read_buffer(buffer, buffer_offset, op.result.res);
534
534
  ret = INT2NUM(op.result.res);
535
535
 
536
536
  }
@@ -580,6 +580,22 @@ VALUE um_write(struct um *machine, int fd, VALUE buffer, size_t len, __u64 file_
580
580
  return ret;
581
581
  }
582
582
 
583
+ size_t um_write_raw(struct um *machine, int fd, const char *buffer, size_t maxlen) {
584
+ struct um_op op;
585
+ um_prep_op(machine, &op, OP_WRITE, 0);
586
+ struct io_uring_sqe *sqe = um_get_sqe(machine, &op);
587
+ io_uring_prep_write(sqe, fd, buffer, maxlen, 0);
588
+
589
+ VALUE ret = um_yield(machine);
590
+
591
+ if (um_check_completion(machine, &op))
592
+ return op.result.res;
593
+
594
+ RAISE_IF_EXCEPTION(ret);
595
+ RB_GC_GUARD(ret);
596
+ return 0;
597
+ }
598
+
583
599
  VALUE um_writev(struct um *machine, int fd, int argc, VALUE *argv) {
584
600
  __u64 file_offset = -1;
585
601
  if (TYPE(argv[argc - 1]) == T_FIXNUM) {
@@ -805,7 +821,7 @@ VALUE um_recv(struct um *machine, int fd, VALUE buffer, size_t maxlen, int flags
805
821
  VALUE ret = um_yield(machine);
806
822
 
807
823
  if (um_check_completion(machine, &op)) {
808
- um_update_read_buffer(machine, buffer, 0, op.result.res, op.result.flags);
824
+ um_update_read_buffer(buffer, 0, op.result.res);
809
825
  ret = INT2NUM(op.result.res);
810
826
  }
811
827
 
data/ext/um/um.h CHANGED
@@ -170,7 +170,7 @@ struct um {
170
170
  struct buf_ring_descriptor buffer_rings[BUFFER_RING_MAX_COUNT];
171
171
 
172
172
  struct um_op *transient_head; // list of pending transient ops
173
- VALUE pending_fibers; // hash containing pending fibers
173
+ VALUE pending_fibers; // set containing pending fibers
174
174
 
175
175
  struct um_op *runqueue_head;
176
176
  struct um_op *runqueue_tail;
@@ -268,7 +268,7 @@ void um_prep_op(struct um *machine, struct um_op *op, enum um_op_kind kind, unsi
268
268
  void um_raise_on_error_result(int result);
269
269
  void um_get_buffer_bytes_for_writing(VALUE buffer, const void **base, size_t *size);
270
270
  void * um_prepare_read_buffer(VALUE buffer, ssize_t len, ssize_t ofs);
271
- void um_update_read_buffer(struct um *machine, VALUE buffer, ssize_t buffer_offset, __s32 result, __u32 flags);
271
+ void um_update_read_buffer(VALUE buffer, ssize_t buffer_offset, __s32 result);
272
272
  int um_setup_buffer_ring(struct um *machine, unsigned size, unsigned count);
273
273
  VALUE um_get_string_from_buffer_ring(struct um *machine, int bgid, __s32 result, __u32 flags);
274
274
  void um_add_strings_to_buffer_ring(struct um *machine, int bgid, VALUE strings);
@@ -297,6 +297,7 @@ VALUE um_read(struct um *machine, int fd, VALUE buffer, size_t maxlen, ssize_t b
297
297
  size_t um_read_raw(struct um *machine, int fd, char *buffer, size_t maxlen);
298
298
  VALUE um_read_each(struct um *machine, int fd, int bgid);
299
299
  VALUE um_write(struct um *machine, int fd, VALUE buffer, size_t len, __u64 file_offset);
300
+ size_t um_write_raw(struct um *machine, int fd, const char *buffer, size_t maxlen);
300
301
  VALUE um_writev(struct um *machine, int fd, int argc, VALUE *argv);
301
302
  VALUE um_write_async(struct um *machine, int fd, VALUE buffer, size_t len, __u64 file_offset);
302
303
  VALUE um_close(struct um *machine, int fd);
@@ -368,4 +369,8 @@ void um_sidecar_teardown(struct um *machine);
368
369
  void um_sidecar_signal_wait(struct um *machine);
369
370
  void um_sidecar_signal_wake(struct um *machine);
370
371
 
372
+ void um_ssl_set_bio(struct um *machine, VALUE ssl_obj);
373
+ int um_ssl_read(struct um *machine, VALUE ssl, VALUE buf, int maxlen);
374
+ int um_ssl_write(struct um *machine, VALUE ssl, VALUE buf, int len);
375
+
371
376
  #endif // UM_H
@@ -1,6 +1,13 @@
1
1
  #include "um.h"
2
2
  #include <stdlib.h>
3
3
 
4
+ /*
5
+ * Document-class: UringMachine::AsyncOp
6
+ *
7
+ * Encapsulates an asynchronous operation. Currently the only asynchronous
8
+ * operation supported is a timeout operation.
9
+ */
10
+
4
11
  VALUE cAsyncOp;
5
12
 
6
13
  VALUE SYM_timeout;
@@ -59,6 +66,10 @@ inline int async_op_is_done(struct um_async_op *async_op) {
59
66
  return (async_op->op->flags & OP_F_COMPLETED);
60
67
  }
61
68
 
69
+ /* Returns the kind of asynchronous operation.
70
+ *
71
+ * @return [Symbol] operation kind
72
+ */
62
73
  VALUE AsyncOp_kind(VALUE self) {
63
74
  struct um_async_op *async_op = AsyncOp_data(self);
64
75
  raise_on_missing_op(async_op);
@@ -71,6 +82,10 @@ VALUE AsyncOp_kind(VALUE self) {
71
82
  }
72
83
  }
73
84
 
85
+ /* Returns true if the operation has completed.
86
+ *
87
+ * @return [bool] is the operation done
88
+ */
74
89
  VALUE AsyncOp_done_p(VALUE self) {
75
90
  struct um_async_op *async_op = AsyncOp_data(self);
76
91
  raise_on_missing_op(async_op);
@@ -78,6 +93,10 @@ VALUE AsyncOp_done_p(VALUE self) {
78
93
  return async_op_is_done(async_op) ? Qtrue : Qfalse;
79
94
  }
80
95
 
96
+ /* Returns the operation result. If the operation is not completed, returns nil.
97
+ *
98
+ * @return [Integer, nil] operation result
99
+ */
81
100
  VALUE AsyncOp_result(VALUE self) {
82
101
  struct um_async_op *async_op = AsyncOp_data(self);
83
102
  raise_on_missing_op(async_op);
@@ -85,6 +104,10 @@ VALUE AsyncOp_result(VALUE self) {
85
104
  return async_op_is_done(async_op) ? INT2NUM(async_op->op->result.res) : Qnil;
86
105
  }
87
106
 
107
+ /* Returns true if the operation has been cancelled.
108
+ *
109
+ * @return [bool] is the operation cancelled
110
+ */
88
111
  VALUE AsyncOp_cancelled_p(VALUE self) {
89
112
  struct um_async_op *async_op = AsyncOp_data(self);
90
113
  raise_on_missing_op(async_op);
@@ -94,6 +117,10 @@ VALUE AsyncOp_cancelled_p(VALUE self) {
94
117
  return (async_op->op->result.res == -ECANCELED) ? Qtrue : Qfalse;
95
118
  }
96
119
 
120
+ /* Waits for the operation to complete.
121
+ *
122
+ * @return [Integer] operation result
123
+ */
97
124
  VALUE AsyncOp_await(VALUE self) {
98
125
  struct um_async_op *async_op = AsyncOp_data(self);
99
126
  raise_on_missing_op(async_op);
@@ -104,6 +131,10 @@ VALUE AsyncOp_await(VALUE self) {
104
131
  return um_async_op_await(async_op);
105
132
  }
106
133
 
134
+ /* Cancels the operation.
135
+ *
136
+ * @return [UringMachine::AsyncOp] self
137
+ */
107
138
  VALUE AsyncOp_cancel(VALUE self) {
108
139
  struct um_async_op *async_op = AsyncOp_data(self);
109
140
  raise_on_missing_op(async_op);