uringmachine 0.16 → 0.18

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 (259) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +3 -0
  3. data/.gitmodules +4 -0
  4. data/CHANGELOG.md +8 -0
  5. data/TODO.md +12 -3
  6. data/examples/bm_send.rb +86 -0
  7. data/ext/um/um.c +28 -1
  8. data/ext/um/um.h +3 -0
  9. data/ext/um/um_class.c +17 -0
  10. data/ext/um/um_utils.c +38 -15
  11. data/lib/uringmachine/version.rb +1 -1
  12. data/test/test_um.rb +76 -0
  13. data/vendor/libressl/.github/scripts/changelog.sh +74 -0
  14. data/vendor/libressl/.github/workflows/android.yml +35 -0
  15. data/vendor/libressl/.github/workflows/cifuzz.yml +33 -0
  16. data/vendor/libressl/.github/workflows/cmake-config.yml +98 -0
  17. data/vendor/libressl/.github/workflows/coverity.yml +69 -0
  18. data/vendor/libressl/.github/workflows/emscripten.yml +71 -0
  19. data/vendor/libressl/.github/workflows/fedora-rawhide.yml +39 -0
  20. data/vendor/libressl/.github/workflows/freebsd.yml +71 -0
  21. data/vendor/libressl/.github/workflows/linux.yml +71 -0
  22. data/vendor/libressl/.github/workflows/macos.yml +37 -0
  23. data/vendor/libressl/.github/workflows/release.yml +81 -0
  24. data/vendor/libressl/.github/workflows/rust-openssl.yml +47 -0
  25. data/vendor/libressl/.github/workflows/solaris.yml +37 -0
  26. data/vendor/libressl/.github/workflows/windows.yml +70 -0
  27. data/vendor/libressl/.gitignore +333 -0
  28. data/vendor/libressl/CMakeLists.txt +581 -0
  29. data/vendor/libressl/COPYING +133 -0
  30. data/vendor/libressl/ChangeLog +3280 -0
  31. data/vendor/libressl/FindLibreSSL.cmake +232 -0
  32. data/vendor/libressl/LibreSSLConfig.cmake.in +36 -0
  33. data/vendor/libressl/Makefile.am +60 -0
  34. data/vendor/libressl/Makefile.am.common +20 -0
  35. data/vendor/libressl/OPENBSD_BRANCH +1 -0
  36. data/vendor/libressl/README.md +238 -0
  37. data/vendor/libressl/README.mingw.md +43 -0
  38. data/vendor/libressl/apps/CMakeLists.txt +18 -0
  39. data/vendor/libressl/apps/Makefile.am +5 -0
  40. data/vendor/libressl/apps/nc/CMakeLists.txt +67 -0
  41. data/vendor/libressl/apps/nc/Makefile.am +64 -0
  42. data/vendor/libressl/apps/nc/compat/accept4.c +17 -0
  43. data/vendor/libressl/apps/nc/compat/readpassphrase.c +205 -0
  44. data/vendor/libressl/apps/nc/compat/socket.c +29 -0
  45. data/vendor/libressl/apps/nc/compat/sys/socket.h +30 -0
  46. data/vendor/libressl/apps/ocspcheck/CMakeLists.txt +44 -0
  47. data/vendor/libressl/apps/ocspcheck/Makefile.am +45 -0
  48. data/vendor/libressl/apps/ocspcheck/compat/.gitignore +0 -0
  49. data/vendor/libressl/apps/openssl/CMakeLists.txt +97 -0
  50. data/vendor/libressl/apps/openssl/Makefile.am +108 -0
  51. data/vendor/libressl/apps/openssl/apps_win.c +138 -0
  52. data/vendor/libressl/apps/openssl/certhash_win.c +13 -0
  53. data/vendor/libressl/apps/openssl/compat/clock_gettime_osx.c +26 -0
  54. data/vendor/libressl/apps/openssl/compat/poll_win.c +329 -0
  55. data/vendor/libressl/appveyor.yml +53 -0
  56. data/vendor/libressl/autogen.sh +15 -0
  57. data/vendor/libressl/check-release.sh +86 -0
  58. data/vendor/libressl/cmake_export_symbol.cmake +71 -0
  59. data/vendor/libressl/cmake_uninstall.cmake.in +36 -0
  60. data/vendor/libressl/config +17 -0
  61. data/vendor/libressl/configure.ac +165 -0
  62. data/vendor/libressl/crypto/CMakeLists.txt +863 -0
  63. data/vendor/libressl/crypto/Makefile.am +962 -0
  64. data/vendor/libressl/crypto/Makefile.am.arc4random +46 -0
  65. data/vendor/libressl/crypto/Makefile.am.elf-mips +14 -0
  66. data/vendor/libressl/crypto/Makefile.am.elf-mips64 +14 -0
  67. data/vendor/libressl/crypto/Makefile.am.elf-x86_64 +35 -0
  68. data/vendor/libressl/crypto/Makefile.am.macosx-x86_64 +35 -0
  69. data/vendor/libressl/crypto/Makefile.am.masm-x86_64 +22 -0
  70. data/vendor/libressl/crypto/Makefile.am.mingw64-x86_64 +23 -0
  71. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_darwin.c +60 -0
  72. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_linux.c +62 -0
  73. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_none.c +26 -0
  74. data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_windows.c +36 -0
  75. data/vendor/libressl/crypto/arch/loongarch64/crypto_arch.h +21 -0
  76. data/vendor/libressl/crypto/arch/mips/crypto_arch.h +21 -0
  77. data/vendor/libressl/crypto/bn/arch/loongarch64/bn_arch.h +23 -0
  78. data/vendor/libressl/crypto/bn/arch/mips/bn_arch.h +24 -0
  79. data/vendor/libressl/crypto/compat/.gitignore +31 -0
  80. data/vendor/libressl/crypto/compat/arc4random.h +41 -0
  81. data/vendor/libressl/crypto/compat/b_win.c +55 -0
  82. data/vendor/libressl/crypto/compat/bsd-asprintf.c +96 -0
  83. data/vendor/libressl/crypto/compat/crypto_lock_win.c +56 -0
  84. data/vendor/libressl/crypto/compat/explicit_bzero_win.c +13 -0
  85. data/vendor/libressl/crypto/compat/freezero.c +32 -0
  86. data/vendor/libressl/crypto/compat/getdelim.c +78 -0
  87. data/vendor/libressl/crypto/compat/getline.c +40 -0
  88. data/vendor/libressl/crypto/compat/getopt_long.c +528 -0
  89. data/vendor/libressl/crypto/compat/getpagesize.c +18 -0
  90. data/vendor/libressl/crypto/compat/getprogname_linux.c +23 -0
  91. data/vendor/libressl/crypto/compat/getprogname_unimpl.c +7 -0
  92. data/vendor/libressl/crypto/compat/getprogname_windows.c +13 -0
  93. data/vendor/libressl/crypto/compat/posix_win.c +296 -0
  94. data/vendor/libressl/crypto/compat/syslog_r.c +19 -0
  95. data/vendor/libressl/crypto/compat/ui_openssl_win.c +334 -0
  96. data/vendor/libressl/dist.sh +22 -0
  97. data/vendor/libressl/gen-coverage-report.sh +58 -0
  98. data/vendor/libressl/gen-openbsd-tags.sh +20 -0
  99. data/vendor/libressl/include/CMakeLists.txt +61 -0
  100. data/vendor/libressl/include/Makefile.am +79 -0
  101. data/vendor/libressl/include/arch/loongarch64/opensslconf.h +150 -0
  102. data/vendor/libressl/include/arch/mips/opensslconf.h +150 -0
  103. data/vendor/libressl/include/compat/arpa/inet.h +15 -0
  104. data/vendor/libressl/include/compat/arpa/nameser.h +25 -0
  105. data/vendor/libressl/include/compat/cet.h +19 -0
  106. data/vendor/libressl/include/compat/dirent.h +17 -0
  107. data/vendor/libressl/include/compat/dirent_msvc.h +611 -0
  108. data/vendor/libressl/include/compat/endian.h +161 -0
  109. data/vendor/libressl/include/compat/err.h +95 -0
  110. data/vendor/libressl/include/compat/fcntl.h +32 -0
  111. data/vendor/libressl/include/compat/getopt.h +50 -0
  112. data/vendor/libressl/include/compat/limits.h +25 -0
  113. data/vendor/libressl/include/compat/netdb.h +10 -0
  114. data/vendor/libressl/include/compat/netinet/in.h +19 -0
  115. data/vendor/libressl/include/compat/netinet/ip.h +49 -0
  116. data/vendor/libressl/include/compat/netinet/tcp.h +10 -0
  117. data/vendor/libressl/include/compat/poll.h +63 -0
  118. data/vendor/libressl/include/compat/pthread.h +122 -0
  119. data/vendor/libressl/include/compat/readpassphrase.h +44 -0
  120. data/vendor/libressl/include/compat/resolv.h +24 -0
  121. data/vendor/libressl/include/compat/stdint.h +31 -0
  122. data/vendor/libressl/include/compat/stdio.h +65 -0
  123. data/vendor/libressl/include/compat/stdlib.h +57 -0
  124. data/vendor/libressl/include/compat/string.h +98 -0
  125. data/vendor/libressl/include/compat/sys/_null.h +18 -0
  126. data/vendor/libressl/include/compat/sys/ioctl.h +11 -0
  127. data/vendor/libressl/include/compat/sys/mman.h +19 -0
  128. data/vendor/libressl/include/compat/sys/param.h +15 -0
  129. data/vendor/libressl/include/compat/sys/queue.h +536 -0
  130. data/vendor/libressl/include/compat/sys/select.h +10 -0
  131. data/vendor/libressl/include/compat/sys/socket.h +18 -0
  132. data/vendor/libressl/include/compat/sys/stat.h +129 -0
  133. data/vendor/libressl/include/compat/sys/time.h +37 -0
  134. data/vendor/libressl/include/compat/sys/tree.h +1006 -0
  135. data/vendor/libressl/include/compat/sys/types.h +69 -0
  136. data/vendor/libressl/include/compat/sys/uio.h +17 -0
  137. data/vendor/libressl/include/compat/syslog.h +38 -0
  138. data/vendor/libressl/include/compat/time.h +59 -0
  139. data/vendor/libressl/include/compat/unistd.h +83 -0
  140. data/vendor/libressl/include/compat/win32netcompat.h +57 -0
  141. data/vendor/libressl/include/openssl/Makefile.am.tpl +45 -0
  142. data/vendor/libressl/libcrypto.pc.in +28 -0
  143. data/vendor/libressl/libressl.pub +2 -0
  144. data/vendor/libressl/libssl.pc.in +28 -0
  145. data/vendor/libressl/libtls.pc.in +28 -0
  146. data/vendor/libressl/m4/ax_add_fortify_source.m4 +80 -0
  147. data/vendor/libressl/m4/ax_check_compile_flag.m4 +53 -0
  148. data/vendor/libressl/m4/check-hardening-options.m4 +110 -0
  149. data/vendor/libressl/m4/check-libc.m4 +189 -0
  150. data/vendor/libressl/m4/check-os-options.m4 +181 -0
  151. data/vendor/libressl/m4/disable-compiler-warnings.m4 +44 -0
  152. data/vendor/libressl/man/CMakeLists.txt +26 -0
  153. data/vendor/libressl/man/links +2780 -0
  154. data/vendor/libressl/man/update_links.sh +25 -0
  155. data/vendor/libressl/openssl.pc.in +11 -0
  156. data/vendor/libressl/patches/bn_shift.patch +34 -0
  157. data/vendor/libressl/patches/crypto_arch.h.patch +34 -0
  158. data/vendor/libressl/patches/crypto_namespace.h.patch +22 -0
  159. data/vendor/libressl/patches/netcat.c.patch +178 -0
  160. data/vendor/libressl/patches/openssl.c.patch +12 -0
  161. data/vendor/libressl/patches/opensslfeatures.h.patch +49 -0
  162. data/vendor/libressl/patches/patch-amd64-crypto-cpu-caps.c.patch +20 -0
  163. data/vendor/libressl/patches/patch-i386-crypto-cpu-caps.c.patch +20 -0
  164. data/vendor/libressl/patches/speed.c.patch +114 -0
  165. data/vendor/libressl/patches/ssl_namespace.h.patch +21 -0
  166. data/vendor/libressl/patches/tls.h.patch +16 -0
  167. data/vendor/libressl/patches/tls_config.c.patch +15 -0
  168. data/vendor/libressl/patches/win32_amd64_bn_arch.h.patch +28 -0
  169. data/vendor/libressl/patches/windows_headers.patch +80 -0
  170. data/vendor/libressl/scripts/config.guess +1774 -0
  171. data/vendor/libressl/scripts/config.sub +1907 -0
  172. data/vendor/libressl/scripts/i686-w64-mingw32.cmake +9 -0
  173. data/vendor/libressl/scripts/test +210 -0
  174. data/vendor/libressl/scripts/wrap-compiler-for-flag-check +31 -0
  175. data/vendor/libressl/scripts/x86_64-w64-mingw32.cmake +9 -0
  176. data/vendor/libressl/ssl/CMakeLists.txt +183 -0
  177. data/vendor/libressl/ssl/Makefile.am +187 -0
  178. data/vendor/libressl/tests/CMakeLists.txt +970 -0
  179. data/vendor/libressl/tests/Makefile.am +944 -0
  180. data/vendor/libressl/tests/aeadtest.sh +30 -0
  181. data/vendor/libressl/tests/arc4randomforktest.sh +21 -0
  182. data/vendor/libressl/tests/asn1time_small.test +10 -0
  183. data/vendor/libressl/tests/cmake/CMakeLists.txt +52 -0
  184. data/vendor/libressl/tests/cmake/crypto.c +7 -0
  185. data/vendor/libressl/tests/cmake/ssl.c +6 -0
  186. data/vendor/libressl/tests/cmake/tls.c +6 -0
  187. data/vendor/libressl/tests/compat/pipe2.c +186 -0
  188. data/vendor/libressl/tests/dtlstest.sh +28 -0
  189. data/vendor/libressl/tests/evptest.sh +22 -0
  190. data/vendor/libressl/tests/keypairtest.sh +27 -0
  191. data/vendor/libressl/tests/mlkem_tests.sh +39 -0
  192. data/vendor/libressl/tests/ocsptest.bat +25 -0
  193. data/vendor/libressl/tests/ocsptest.sh +23 -0
  194. data/vendor/libressl/tests/openssl.cnf +29 -0
  195. data/vendor/libressl/tests/optionstest.c +381 -0
  196. data/vendor/libressl/tests/pidwraptest.c +85 -0
  197. data/vendor/libressl/tests/pidwraptest.sh +26 -0
  198. data/vendor/libressl/tests/quictest.bat +27 -0
  199. data/vendor/libressl/tests/quictest.sh +30 -0
  200. data/vendor/libressl/tests/renegotiation_test.bat +27 -0
  201. data/vendor/libressl/tests/renegotiation_test.sh +30 -0
  202. data/vendor/libressl/tests/rfc5280time_small.test +10 -0
  203. data/vendor/libressl/tests/servertest.bat +27 -0
  204. data/vendor/libressl/tests/servertest.sh +30 -0
  205. data/vendor/libressl/tests/shutdowntest.bat +27 -0
  206. data/vendor/libressl/tests/shutdowntest.sh +30 -0
  207. data/vendor/libressl/tests/ssltest.bat +32 -0
  208. data/vendor/libressl/tests/ssltest.sh +48 -0
  209. data/vendor/libressl/tests/testdsa.bat +47 -0
  210. data/vendor/libressl/tests/testdsa.sh +57 -0
  211. data/vendor/libressl/tests/testenc.bat +85 -0
  212. data/vendor/libressl/tests/testenc.sh +93 -0
  213. data/vendor/libressl/tests/testrsa.bat +47 -0
  214. data/vendor/libressl/tests/testrsa.sh +57 -0
  215. data/vendor/libressl/tests/testssl.bat +171 -0
  216. data/vendor/libressl/tests/tlstest.bat +27 -0
  217. data/vendor/libressl/tests/tlstest.sh +28 -0
  218. data/vendor/libressl/tls/CMakeLists.txt +125 -0
  219. data/vendor/libressl/tls/Makefile.am +76 -0
  220. data/vendor/libressl/tls/compat/ftruncate.c +17 -0
  221. data/vendor/libressl/tls/compat/pread.c +29 -0
  222. data/vendor/libressl/tls/compat/pwrite.c +29 -0
  223. data/vendor/libressl/update.sh +460 -0
  224. data/vendor/liburing/.github/workflows/ci.yml +8 -0
  225. data/vendor/liburing/configure +23 -2
  226. data/vendor/liburing/examples/helpers.c +1 -1
  227. data/vendor/liburing/examples/helpers.h +1 -1
  228. data/vendor/liburing/examples/reg-wait.c +3 -3
  229. data/vendor/liburing/examples/zcrx.c +5 -5
  230. data/vendor/liburing/liburing.spec +1 -1
  231. data/vendor/liburing/src/include/liburing/io_uring.h +16 -0
  232. data/vendor/liburing/src/include/liburing.h +20 -4
  233. data/vendor/liburing/src/lib.h +2 -4
  234. data/vendor/liburing/src/liburing-ffi.map +7 -0
  235. data/vendor/liburing/src/liburing.map +7 -0
  236. data/vendor/liburing/src/register.c +5 -0
  237. data/vendor/liburing/src/sanitize.c +5 -4
  238. data/vendor/liburing/src/setup.c +43 -28
  239. data/vendor/liburing/test/Makefile +7 -0
  240. data/vendor/liburing/test/cmd-discard.c +2 -2
  241. data/vendor/liburing/test/evfd-short-read.c +84 -0
  242. data/vendor/liburing/test/fdinfo-sqpoll.c +117 -0
  243. data/vendor/liburing/test/fdinfo.c +1 -1
  244. data/vendor/liburing/test/fixed-buf-merge.c +2 -2
  245. data/vendor/liburing/test/futex-kill.c +135 -0
  246. data/vendor/liburing/test/helpers.c +1 -1
  247. data/vendor/liburing/test/helpers.h +1 -1
  248. data/vendor/liburing/test/init-mem.c +50 -12
  249. data/vendor/liburing/test/io_uring_passthrough.c +25 -6
  250. data/vendor/liburing/test/msg-ring.c +123 -9
  251. data/vendor/liburing/test/recv-bundle-short-ooo.c +16 -1
  252. data/vendor/liburing/test/recv-inc-ooo.c +411 -0
  253. data/vendor/liburing/test/recv-mshot-fair.c +513 -0
  254. data/vendor/liburing/test/reg-wait.c +14 -14
  255. data/vendor/liburing/test/send-zerocopy.c +4 -4
  256. data/vendor/liburing/test/timerfd-short-read.c +81 -0
  257. data/vendor/liburing/test/timestamp.c +382 -0
  258. data/vendor/liburing/test/zcrx.c +22 -22
  259. metadata +222 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31417b87cc8d871a492fccfd525b4f991b7ab69546503797c675bdaa07dfe00d
4
- data.tar.gz: b64826a1efb663adad00c61733c37234ace8637725447d85a7b5819cde652cf8
3
+ metadata.gz: 18144dad22716ba83fde0f2ec1d3bffbb1a13684044f99f279eba183a70e7181
4
+ data.tar.gz: 0e742fa4e8ac06475fa7bfab120239863b76f47f5ca33c2a9cc3d0c26ef27bc8
5
5
  SHA512:
6
- metadata.gz: eb438c42b59e8c601bc1a591e9d750fd475bf416e5e44945c6492a4ef46bf20daf89ed6af002e36a9df7f4f2f9d79689976080262cc479723cd5b963e7de4e4f
7
- data.tar.gz: 69503b7a95f2316e4847b1f65b667c2f023df4a4388c3f15fffad5b16fc6577ab537d579523ec48a69a79f282cefab926a00821e96d63e274edebfa4cc663e57
6
+ metadata.gz: fe981430bc6dace32cb166e3e8177ab5b4cf90f86021ee14990fa01b573459fbace2f17484e2307a9cf8ee83b59b547ae5e2c051774fcb8a444297293214d1e4
7
+ data.tar.gz: 8cc7d29d54de95ab70d197db9c1a035d6302750ca86d2ecfb94599e9bed5e3b4f1119eefc8e4804f89f09a20242cd35c0fe277b1a214f2742fce7642b6b83c97
@@ -0,0 +1,3 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: noteflakes
data/.gitmodules CHANGED
@@ -1,3 +1,7 @@
1
1
  [submodule "vendor/liburing"]
2
2
  path = vendor/liburing
3
3
  url = https://github.com/axboe/liburing
4
+
5
+ [submodule "vendor/libressl"]
6
+ path = vendor/libressl
7
+ url = https://github.com/libressl/portable
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 0.18 2025-08-30
2
+
3
+ - Fix `#write_async` to properly mark the given string
4
+
5
+ # 0.17 2025-07-15
6
+
7
+ - Add `#send_bundle` method
8
+
1
9
  # 2025-07-06 Version 0.16
2
10
 
3
11
  - Load UM version on require
data/TODO.md CHANGED
@@ -1,9 +1,18 @@
1
- # ops
1
+ ## useful concurrency tools
2
+
3
+ - debounce
4
+
5
+ ```ruby
6
+ debouncer = UM.debounce { }
7
+ ```
8
+
9
+ ## ops
2
10
 
3
11
  - [ ] multishot timeout
4
12
  - [v] machine.periodically(interval) { ... }
5
13
  - [ ] machine.prep_timeout_multishot(interval)
6
14
 
15
+ - writev
7
16
  - splice / - tee
8
17
  - sendto
9
18
  - recvfrom
@@ -17,12 +26,12 @@
17
26
  - getxattr / setxattr
18
27
  - send_bundle / recv_bundle (kernel >= 6.10)
19
28
 
20
- # actors
29
+ ## actors
21
30
 
22
31
  When doing a `call`, we need to provide a mailbox for the response. can this be
23
32
  automatic?
24
33
 
25
- # streams
34
+ ## streams
26
35
 
27
36
  We're still missing:
28
37
 
@@ -0,0 +1,86 @@
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-ips'
9
+ end
10
+
11
+ require 'benchmark/ips'
12
+ require 'uringmachine'
13
+
14
+ @machine = UM.new
15
+
16
+ make_socket_pair = -> do
17
+ port = 10000 + rand(30000)
18
+ server_fd = @machine.socket(UM::AF_INET, UM::SOCK_STREAM, 0, 0)
19
+ @machine.setsockopt(server_fd, UM::SOL_SOCKET, UM::SO_REUSEADDR, true)
20
+ @machine.bind(server_fd, '127.0.0.1', port)
21
+ @machine.listen(server_fd, UM::SOMAXCONN)
22
+
23
+ client_conn_fd = @machine.socket(UM::AF_INET, UM::SOCK_STREAM, 0, 0)
24
+ @machine.connect(client_conn_fd, '127.0.0.1', port)
25
+
26
+ server_conn_fd = @machine.accept(server_fd)
27
+
28
+ @machine.close(server_fd)
29
+ [client_conn_fd, server_conn_fd]
30
+ end
31
+
32
+ @client_fd, @server_fd = make_socket_pair.()
33
+
34
+ @read_buf = +''
35
+ @read_fiber = @machine.spin do
36
+ while true
37
+ @machine.read(@client_fd, @read_buf, 65536, 0)
38
+ end
39
+ end
40
+
41
+ STR_COUNT = ARGV[0]&.to_i || 3
42
+ STR_SIZE = ARGV[1]&.to_i || 100
43
+
44
+ @parts = ['*' * STR_SIZE] * STR_COUNT
45
+
46
+ @server_io = IO.new(@server_fd)
47
+ @server_io.sync = true
48
+ def io_write
49
+ @server_io.write(*@parts)
50
+ @machine.snooze
51
+ end
52
+
53
+ def um_write
54
+ str = @parts.join
55
+ len = str.bytesize
56
+
57
+ while len > 0
58
+ ret = @machine.write(@server_fd, str, len)
59
+ len -= ret
60
+ str = str[ret..-1] if len > 0
61
+ end
62
+ end
63
+
64
+ def um_send
65
+ str = @parts.join
66
+ @machine.send(@server_fd, str, str.bytesize, UM::MSG_WAITALL)
67
+ end
68
+
69
+ @bgid = @machine.setup_buffer_ring(0, 8)
70
+ def um_send_bundle
71
+ @machine.send_bundle(@server_fd, @bgid, @parts)
72
+ end
73
+
74
+ # um_send_bundle
75
+ # 10.times { @machine.snooze }
76
+ # exit
77
+
78
+ p(STR_COUNT:, STR_SIZE:)
79
+
80
+ Benchmark.ips do |x|
81
+ x.report('IO#write') { io_write }
82
+ x.report('UM#write') { um_write }
83
+ x.report('UM#send') { um_send }
84
+ x.report('UM#send_bundle') { um_send_bundle }
85
+ x.compare!
86
+ end
data/ext/um/um.c CHANGED
@@ -74,6 +74,9 @@ static inline void um_process_cqe(struct um *machine, struct io_uring_cqe *cqe)
74
74
  // );
75
75
 
76
76
  if (op->flags & OP_F_FREE_ON_COMPLETE) {
77
+ if (op->flags & OP_F_TRANSIENT)
78
+ um_op_transient_remove(machine, op);
79
+
77
80
  um_op_free(machine, op);
78
81
  return;
79
82
  }
@@ -396,11 +399,13 @@ VALUE um_write(struct um *machine, int fd, VALUE str, int len) {
396
399
 
397
400
  VALUE um_write_async(struct um *machine, int fd, VALUE str) {
398
401
  struct um_op *op = um_op_alloc(machine);
399
- um_prep_op(machine, op, OP_WRITE_ASYNC, OP_F_FREE_ON_COMPLETE);
402
+ um_prep_op(machine, op, OP_WRITE_ASYNC, OP_F_TRANSIENT | OP_F_FREE_ON_COMPLETE);
400
403
  RB_OBJ_WRITE(machine->self, &op->value, str);
401
404
 
402
405
  struct io_uring_sqe *sqe = um_get_sqe(machine, op);
403
406
  io_uring_prep_write(sqe, fd, RSTRING_PTR(str), RSTRING_LEN(str), -1);
407
+ um_op_transient_add(machine, op);
408
+
404
409
  return str;
405
410
  }
406
411
 
@@ -485,6 +490,28 @@ VALUE um_send(struct um *machine, int fd, VALUE buffer, int len, int flags) {
485
490
  return raise_if_exception(ret);
486
491
  }
487
492
 
493
+ VALUE um_send_bundle(struct um *machine, int fd, int bgid, VALUE strings) {
494
+ um_add_strings_to_buffer_ring(machine, bgid, strings);
495
+
496
+ struct um_op op;
497
+ um_prep_op(machine, &op, OP_SEND_BUNDLE, 0);
498
+ struct io_uring_sqe *sqe = um_get_sqe(machine, &op);
499
+
500
+ io_uring_prep_send_bundle(sqe, fd, 0, MSG_WAITALL);
501
+ sqe->flags |= IOSQE_BUFFER_SELECT;
502
+ sqe->buf_group = bgid;
503
+
504
+ VALUE ret = um_fiber_switch(machine);
505
+ if (um_check_completion(machine, &op))
506
+ ret = INT2NUM(op.result.res);
507
+
508
+ RB_GC_GUARD(ret);
509
+ return raise_if_exception(ret);
510
+
511
+
512
+ return ret;
513
+ }
514
+
488
515
  VALUE um_recv(struct um *machine, int fd, VALUE buffer, int maxlen, int flags) {
489
516
  struct um_op op;
490
517
  um_prep_op(machine, &op, OP_RECV, 0);
data/ext/um/um.h CHANGED
@@ -36,6 +36,7 @@ enum op_kind {
36
36
  OP_ACCEPT,
37
37
  OP_RECV,
38
38
  OP_SEND,
39
+ OP_SEND_BUNDLE,
39
40
  OP_SOCKET,
40
41
  OP_CONNECT,
41
42
  OP_BIND,
@@ -210,6 +211,7 @@ void * um_prepare_read_buffer(VALUE buffer, unsigned len, int ofs);
210
211
  void um_update_read_buffer(struct um *machine, VALUE buffer, int buffer_offset, __s32 result, __u32 flags);
211
212
  int um_setup_buffer_ring(struct um *machine, unsigned size, unsigned count);
212
213
  VALUE um_get_string_from_buffer_ring(struct um *machine, int bgid, __s32 result, __u32 flags);
214
+ void um_add_strings_to_buffer_ring(struct um *machine, int bgid, VALUE strings);
213
215
 
214
216
  struct io_uring_sqe *um_get_sqe(struct um *machine, struct um_op *op);
215
217
 
@@ -242,6 +244,7 @@ VALUE um_accept_each(struct um *machine, int fd);
242
244
  VALUE um_socket(struct um *machine, int domain, int type, int protocol, uint flags);
243
245
  VALUE um_connect(struct um *machine, int fd, const struct sockaddr *addr, socklen_t addrlen);
244
246
  VALUE um_send(struct um *machine, int fd, VALUE buffer, int len, int flags);
247
+ VALUE um_send_bundle(struct um *machine, int fd, int bgid, VALUE strings);
245
248
  VALUE um_recv(struct um *machine, int fd, VALUE buffer, int maxlen, int flags);
246
249
  VALUE um_recv_each(struct um *machine, int fd, int bgid, int flags);
247
250
  VALUE um_bind(struct um *machine, int fd, struct sockaddr *addr, socklen_t addrlen);
data/ext/um/um_class.c CHANGED
@@ -193,6 +193,22 @@ VALUE UM_send(VALUE self, VALUE fd, VALUE buffer, VALUE len, VALUE flags) {
193
193
  return um_send(machine, NUM2INT(fd), buffer, NUM2INT(len), NUM2INT(flags));
194
194
  }
195
195
 
196
+ VALUE UM_send_bundle(int argc, VALUE *argv, VALUE self) {
197
+ struct um *machine = um_get_machine(self);
198
+ VALUE fd;
199
+ VALUE bgid;
200
+ VALUE strings;
201
+ rb_scan_args(argc, argv, "2*", &fd, &bgid, &strings);
202
+
203
+ if (RARRAY_LEN(strings) == 1) {
204
+ VALUE first = rb_ary_entry(strings, 0);
205
+ if (TYPE(first) == T_ARRAY)
206
+ strings = first;
207
+ }
208
+
209
+ return um_send_bundle(machine, NUM2INT(fd), NUM2INT(bgid), strings);
210
+ }
211
+
196
212
  VALUE UM_recv(VALUE self, VALUE fd, VALUE buffer, VALUE maxlen, VALUE flags) {
197
213
  struct um *machine = um_get_machine(self);
198
214
  return um_recv(machine, NUM2INT(fd), buffer, NUM2INT(maxlen), NUM2INT(flags));
@@ -377,6 +393,7 @@ void Init_UM(void) {
377
393
  rb_define_method(cUM, "recv", UM_recv, 4);
378
394
  rb_define_method(cUM, "recv_each", UM_recv_each, 3);
379
395
  rb_define_method(cUM, "send", UM_send, 4);
396
+ rb_define_method(cUM, "send_bundle", UM_send_bundle, -1);
380
397
  rb_define_method(cUM, "setsockopt", UM_setsockopt, 4);
381
398
  rb_define_method(cUM, "socket", UM_socket, 4);
382
399
  rb_define_method(cUM, "shutdown", UM_shutdown, 2);
data/ext/um/um_utils.c CHANGED
@@ -65,11 +65,11 @@ int um_setup_buffer_ring(struct um *machine, unsigned size, unsigned count) {
65
65
  struct buf_ring_descriptor *desc = machine->buffer_rings + machine->buffer_ring_count;
66
66
  desc->buf_count = count;
67
67
  desc->buf_size = size;
68
-
69
68
  desc->br_size = sizeof(struct io_uring_buf) * desc->buf_count;
69
+ desc->buf_mask = io_uring_buf_ring_mask(desc->buf_count);
70
+
70
71
  void *mapped = mmap(
71
- NULL, desc->br_size, PROT_READ | PROT_WRITE,
72
- MAP_ANONYMOUS | MAP_PRIVATE, 0, 0
72
+ NULL, desc->br_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0
73
73
  );
74
74
  if (mapped == MAP_FAILED)
75
75
  rb_raise(rb_eRuntimeError, "Failed to allocate buffer ring");
@@ -82,21 +82,22 @@ int um_setup_buffer_ring(struct um *machine, unsigned size, unsigned count) {
82
82
  desc->br = io_uring_setup_buf_ring(&machine->ring, count, bg_id, 0, &ret);
83
83
  if (!desc->br) {
84
84
  munmap(desc->br, desc->br_size);
85
- rb_syserr_fail(ret, strerror(ret));
85
+ rb_syserr_fail(-ret, strerror(-ret));
86
86
  }
87
87
 
88
- if (posix_memalign(&desc->buf_base, 4096, desc->buf_count * desc->buf_size)) {
89
- io_uring_free_buf_ring(&machine->ring, desc->br, desc->buf_count, bg_id);
90
- rb_raise(rb_eRuntimeError, "Failed to allocate buffers");
88
+ if (size > 0) {
89
+ if (posix_memalign(&desc->buf_base, 4096, desc->buf_count * desc->buf_size)) {
90
+ io_uring_free_buf_ring(&machine->ring, desc->br, desc->buf_count, bg_id);
91
+ rb_raise(rb_eRuntimeError, "Failed to allocate buffers");
92
+ }
93
+
94
+ void *ptr = desc->buf_base;
95
+ for (unsigned i = 0; i < desc->buf_count; i++) {
96
+ io_uring_buf_ring_add(desc->br, ptr, desc->buf_size, i, desc->buf_mask, i);
97
+ ptr += desc->buf_size;
98
+ }
99
+ io_uring_buf_ring_advance(desc->br, desc->buf_count);
91
100
  }
92
-
93
- desc->buf_mask = io_uring_buf_ring_mask(desc->buf_count);
94
- void *ptr = desc->buf_base;
95
- for (unsigned i = 0; i < desc->buf_count; i++) {
96
- io_uring_buf_ring_add(desc->br, ptr, desc->buf_size, i, desc->buf_mask, i);
97
- ptr += desc->buf_size;
98
- }
99
- io_uring_buf_ring_advance(desc->br, desc->buf_count);
100
101
  machine->buffer_ring_count++;
101
102
  return bg_id;
102
103
  }
@@ -120,3 +121,25 @@ inline VALUE um_get_string_from_buffer_ring(struct um *machine, int bgid, __s32
120
121
  RB_GC_GUARD(buf);
121
122
  return buf;
122
123
  }
124
+
125
+ inline void um_add_strings_to_buffer_ring(struct um *machine, int bgid, VALUE strings) {
126
+ static ID ID_to_s = 0;
127
+
128
+ struct buf_ring_descriptor *desc = machine->buffer_rings + bgid;
129
+ ulong count = RARRAY_LEN(strings);
130
+ VALUE str = Qnil;
131
+ VALUE converted = Qnil;
132
+
133
+ for (ulong i = 0; i < count; i++) {
134
+ str = rb_ary_entry(strings, i);
135
+ if (TYPE(str) != T_STRING) {
136
+ if (!ID_to_s) ID_to_s = rb_intern("to_s");
137
+ if (NIL_P(converted)) converted = rb_ary_new();
138
+ str = rb_funcall(str, ID_to_s, 0);
139
+ rb_ary_push(converted, str);
140
+ }
141
+ io_uring_buf_ring_add(desc->br, RSTRING_PTR(str), RSTRING_LEN(str), i, desc->buf_mask, i);
142
+ }
143
+ RB_GC_GUARD(converted);
144
+ io_uring_buf_ring_advance(desc->br, count);
145
+ }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class UringMachine
4
- VERSION = '0.16'
4
+ VERSION = '0.18'
5
5
  end
data/test/test_um.rb CHANGED
@@ -565,6 +565,22 @@ class WriteAsyncTest < UMBaseTest
565
565
  assert_equal 'foo', r.readpartial(3)
566
566
  end
567
567
 
568
+ def test_write_async_dynamic_string
569
+ r, w = IO.pipe
570
+
571
+ assert_equal 0, machine.pending_count
572
+ str = "foo#{123}#{'bar' * 48}"
573
+ len = str.bytesize
574
+ machine.write_async(w.fileno, str)
575
+ str = nil
576
+ GC.start
577
+ assert_equal 1, machine.pending_count
578
+
579
+ machine.snooze
580
+ assert_equal 0, machine.pending_count
581
+ assert_equal "foo#{123}#{'bar' * 48}", r.readpartial(len)
582
+ end
583
+
568
584
  def test_write_async_bad_fd
569
585
  r, _w = IO.pipe
570
586
 
@@ -1417,5 +1433,65 @@ class ForkTest < UMBaseTest
1417
1433
  ensure
1418
1434
  Process.wait(child_pid) rescue Errno::ECHILD
1419
1435
  end
1436
+ end
1437
+
1438
+ class SendBundleTest < UMBaseTest
1439
+ def setup
1440
+ super
1441
+ @client_fd, @server_fd = make_socket_pair
1442
+ end
1443
+
1444
+ def test_send_bundle_splat
1445
+ skip if UringMachine.kernel_version < 610
1446
+
1447
+ bgid = machine.setup_buffer_ring(0, 8)
1448
+ assert_equal 0, bgid
1449
+
1450
+ strs = ['foo', 'bar', 'bazzzzz']
1451
+ len = strs.inject(0) { |len, s| len + s.bytesize }
1452
+
1453
+ ret = machine.send_bundle(@client_fd, bgid, *strs)
1454
+ assert_equal len, ret
1420
1455
 
1456
+ buf = +''
1457
+ ret = machine.recv(@server_fd, buf, 8192, 0)
1458
+ assert_equal len, ret
1459
+ assert_equal strs.join, buf
1460
+ end
1461
+
1462
+ def test_send_bundle_array
1463
+ skip if UringMachine.kernel_version < 610
1464
+
1465
+ bgid = machine.setup_buffer_ring(0, 8)
1466
+ assert_equal 0, bgid
1467
+
1468
+ strs = ['foo', 'bar', 'bazzzzz']
1469
+ len = strs.inject(0) { |len, s| len + s.bytesize }
1470
+
1471
+ ret = machine.send_bundle(@client_fd, bgid, strs)
1472
+ assert_equal len, ret
1473
+
1474
+ buf = +''
1475
+ ret = machine.recv(@server_fd, buf, 8192, 0)
1476
+ assert_equal len, ret
1477
+ assert_equal strs.join, buf
1478
+ end
1479
+
1480
+ def test_send_bundle_non_strings
1481
+ skip if UringMachine.kernel_version < 610
1482
+
1483
+ bgid = machine.setup_buffer_ring(0, 8)
1484
+ assert_equal 0, bgid
1485
+
1486
+ strs = [42, 'bar', false]
1487
+ len = strs.inject(0) { |len, s| len + s.to_s.bytesize }
1488
+
1489
+ ret = machine.send_bundle(@client_fd, bgid, strs)
1490
+ assert_equal len, ret
1491
+
1492
+ buf = +''
1493
+ ret = machine.recv(@server_fd, buf, 8192, 0)
1494
+ assert_equal len, ret
1495
+ assert_equal strs.map(&:to_s).join, buf
1496
+ end
1421
1497
  end
@@ -0,0 +1,74 @@
1
+ #!/bin/sh
2
+ # Copyright (c) 2023 Joshua Sing <joshua@hypera.dev>
3
+ #
4
+ # Permission to use, copy, modify, and distribute this software for any
5
+ # purpose with or without fee is hereby granted, provided that the above
6
+ # copyright notice and this permission notice appear in all copies.
7
+ #
8
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ #
17
+ # Usage: changelog.sh <version>
18
+ # Reads the changelog for the specified version from the changelog file.
19
+ # The output will be reformatted for use in GitHub releases.
20
+ #
21
+ # The changelog file defaults to "ChangeLog", but can be changed by setting
22
+ # the environment variable $CHANGELOG_FILE
23
+ #
24
+
25
+ set -e
26
+
27
+ # Check if the version argument is provided
28
+ if [ "$#" -ne 1 ]; then
29
+ echo "Usage: $0 <version>" 1>&2
30
+ exit 1
31
+ fi
32
+
33
+ version="${1#v}"
34
+ changelog_file="${CHANGELOG_FILE:-ChangeLog}"
35
+ found_version=false
36
+ changelog=""
37
+
38
+ # Check if the specified changelog file exists
39
+ if [ ! -f "$changelog_file" ]; then
40
+ echo "Error: Changelog file '$changelog_file' not found" 1>&2
41
+ exit 1
42
+ fi
43
+
44
+ # Read the changelog file line by line
45
+ while IFS= read -r line; do
46
+ # Check for the version line
47
+ if echo "$line" | grep -Eq "^${version} - "; then
48
+ found_version=true
49
+ continue
50
+ fi
51
+
52
+ # Continue reading the changelog until the next version or end of file,
53
+ # skipping empty lines
54
+ if $found_version; then
55
+ echo "$line" | grep -Eq "^\s*$" && continue
56
+ echo "$line" | grep -Eq "^[0-9]+\.[0-9]+\.[0-9]+ - " && break
57
+ changelog="${changelog}${line}\n"
58
+ fi
59
+ done < "$changelog_file"
60
+
61
+ # If the specified version was not found, print an error
62
+ if ! $found_version; then
63
+ echo "Error: Version $version was not found in changelog" 1>&2
64
+ exit 1
65
+ fi
66
+
67
+ # Tidy up the changelog for displaying on GitHub
68
+ changelog=$(echo "$changelog" | sed -e 's/^\t\*/###/' -e 's/^\t//')
69
+
70
+ # Print the changelog for the specified version
71
+ echo "$changelog"
72
+ echo
73
+ echo "Full changelog: https://github.com/libressl/portable/blob/master/ChangeLog"
74
+ exit 0
@@ -0,0 +1,35 @@
1
+ # GitHub Actions workflow to run tests on Android.
2
+ name: "Android"
3
+
4
+ on: [push, pull_request]
5
+
6
+ concurrency:
7
+ group: "${{ github.workflow }}-${{ github.event.number || github.ref }}"
8
+ cancel-in-progress: true
9
+
10
+ jobs:
11
+ test:
12
+ name: "Test ${{ matrix.name }}"
13
+ runs-on: ubuntu-24.04
14
+ permissions:
15
+ contents: read
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ include:
20
+ - name: "Android 8-9"
21
+ min-nal: 26
22
+ max-nal: 28
23
+ - name: "Android 10-11"
24
+ min-nal: 29
25
+ max-nal: 30
26
+ steps:
27
+ - name: "Checkout repository"
28
+ uses: actions/checkout@v4
29
+
30
+ - name: "Run CI script"
31
+ run: ./scripts/test
32
+ env:
33
+ ARCH: "android"
34
+ MIN_NAL: "${{ matrix.min-nal }}"
35
+ MAX_NAL: "${{ matrix.max-nal }}"
@@ -0,0 +1,33 @@
1
+ name: CIFuzz
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ concurrency:
7
+ group: "${{ github.workflow }}-${{ github.event.number || github.ref }}"
8
+ cancel-in-progress: true
9
+
10
+ jobs:
11
+ Fuzzing:
12
+ runs-on: ubuntu-24.04
13
+ steps:
14
+ - name: Build Fuzzers
15
+ id: build
16
+ uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
17
+ with:
18
+ oss-fuzz-project-name: 'libressl'
19
+ dry-run: false
20
+ language: c++
21
+ - name: Run Fuzzers
22
+ uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
23
+ with:
24
+ oss-fuzz-project-name: 'libressl'
25
+ fuzz-seconds: 300
26
+ dry-run: false
27
+ language: c++
28
+ - name: Upload Crash
29
+ uses: actions/upload-artifact@v4
30
+ if: failure() && steps.build.outcome == 'success'
31
+ with:
32
+ name: artifacts
33
+ path: ./out/artifacts
@@ -0,0 +1,98 @@
1
+ # GitHub Actions workflow to check CMake config.
2
+ name: "CMake Check"
3
+
4
+ on:
5
+ push: {}
6
+ pull_request: {}
7
+
8
+ concurrency:
9
+ group: "${{ github.workflow }}-${{ github.event.number || github.ref }}"
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ check:
14
+ name: "${{ matrix.os }}"
15
+ runs-on: "${{ matrix.os }}"
16
+ strategy:
17
+ fail-fast: true
18
+ matrix:
19
+ os: [ "windows-2022", "macos-14", "ubuntu-24.04" ]
20
+ defaults:
21
+ run:
22
+ shell: "bash"
23
+ permissions:
24
+ contents: read
25
+ steps:
26
+ - name: "Checkout repository"
27
+ uses: actions/checkout@v4
28
+
29
+ - name: "Setup Windows dependencies"
30
+ if: runner.os == 'Windows'
31
+ uses: msys2/setup-msys2@v2
32
+ with:
33
+ update: true
34
+ install: >-
35
+ autoconf
36
+ automake
37
+ diffutils
38
+ libtool
39
+ gcc
40
+ git
41
+ patch
42
+ perl
43
+
44
+ - name: "Setup macOS dependencies"
45
+ if: runner.os == 'macOS'
46
+ run: brew install automake libtool
47
+
48
+ - name: "Prepare source tree for build (Windows)"
49
+ if: runner.os == 'Windows'
50
+ shell: "msys2 {0}"
51
+ run: ./autogen.sh
52
+
53
+ - name: "Prepare source tree for build (Unix)"
54
+ if: runner.os != 'Windows'
55
+ run: ./autogen.sh
56
+
57
+ - name: "Configure"
58
+ run: |
59
+ cmake -S . \
60
+ -B build \
61
+ -D CMAKE_BUILD_TYPE=Release \
62
+ -D CMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/../local
63
+
64
+ - name: "Build"
65
+ run: cmake --build build --config Release --verbose
66
+
67
+ - name: "Install"
68
+ run: cmake --install build --config Release
69
+
70
+ - name: "Consume from the build directory - Configure"
71
+ run: |
72
+ cmake -S tests/cmake \
73
+ -B consumer-build \
74
+ -D CMAKE_BUILD_TYPE=Release \
75
+ -D LibreSSL_DIR=$GITHUB_WORKSPACE/build
76
+
77
+ - name: "Consume from the build directory - Build"
78
+ run: cmake --build consumer-build --config Release --verbose
79
+
80
+ - name: "Consume from the install directory (CMAKE_PREFIX_PATH) - Configure"
81
+ run: |
82
+ cmake -S tests/cmake \
83
+ -B consumer-install-prefix \
84
+ -D CMAKE_BUILD_TYPE=Release \
85
+ -D CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/../local
86
+
87
+ - name: "Consume from the install directory (CMAKE_PREFIX_PATH) - Build"
88
+ run: cmake --build consumer-install-prefix --config Release --verbose
89
+
90
+ - name: "Consume from the install directory (LibreSSL_DIR) - Configure"
91
+ run: |
92
+ cmake -S tests/cmake \
93
+ -B consumer-install-dir \
94
+ -D CMAKE_BUILD_TYPE=Release \
95
+ -D LibreSSL_DIR=$GITHUB_WORKSPACE/../local/lib/cmake/LibreSSL
96
+
97
+ - name: "Consume from the install directory (LibreSSL_DIR) - Build"
98
+ run: cmake --build consumer-install-dir --config Release --verbose