uringmachine 0.15 → 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.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +3 -0
- data/.gitmodules +4 -0
- data/CHANGELOG.md +12 -0
- data/TODO.md +12 -3
- data/examples/bm_send.rb +86 -0
- data/ext/um/um.c +28 -1
- data/ext/um/um.h +3 -0
- data/ext/um/um_class.c +17 -0
- data/ext/um/um_stream_class.c +0 -1
- data/ext/um/um_utils.c +38 -15
- data/lib/uringmachine/version.rb +1 -1
- data/lib/uringmachine.rb +4 -3
- data/test/test_um.rb +76 -0
- data/vendor/libressl/.github/scripts/changelog.sh +74 -0
- data/vendor/libressl/.github/workflows/android.yml +35 -0
- data/vendor/libressl/.github/workflows/cifuzz.yml +33 -0
- data/vendor/libressl/.github/workflows/cmake-config.yml +98 -0
- data/vendor/libressl/.github/workflows/coverity.yml +69 -0
- data/vendor/libressl/.github/workflows/emscripten.yml +71 -0
- data/vendor/libressl/.github/workflows/fedora-rawhide.yml +39 -0
- data/vendor/libressl/.github/workflows/freebsd.yml +71 -0
- data/vendor/libressl/.github/workflows/linux.yml +71 -0
- data/vendor/libressl/.github/workflows/macos.yml +37 -0
- data/vendor/libressl/.github/workflows/release.yml +81 -0
- data/vendor/libressl/.github/workflows/rust-openssl.yml +47 -0
- data/vendor/libressl/.github/workflows/solaris.yml +37 -0
- data/vendor/libressl/.github/workflows/windows.yml +70 -0
- data/vendor/libressl/.gitignore +333 -0
- data/vendor/libressl/CMakeLists.txt +581 -0
- data/vendor/libressl/COPYING +133 -0
- data/vendor/libressl/ChangeLog +3280 -0
- data/vendor/libressl/FindLibreSSL.cmake +232 -0
- data/vendor/libressl/LibreSSLConfig.cmake.in +36 -0
- data/vendor/libressl/Makefile.am +60 -0
- data/vendor/libressl/Makefile.am.common +20 -0
- data/vendor/libressl/OPENBSD_BRANCH +1 -0
- data/vendor/libressl/README.md +238 -0
- data/vendor/libressl/README.mingw.md +43 -0
- data/vendor/libressl/apps/CMakeLists.txt +18 -0
- data/vendor/libressl/apps/Makefile.am +5 -0
- data/vendor/libressl/apps/nc/CMakeLists.txt +67 -0
- data/vendor/libressl/apps/nc/Makefile.am +64 -0
- data/vendor/libressl/apps/nc/compat/accept4.c +17 -0
- data/vendor/libressl/apps/nc/compat/readpassphrase.c +205 -0
- data/vendor/libressl/apps/nc/compat/socket.c +29 -0
- data/vendor/libressl/apps/nc/compat/sys/socket.h +30 -0
- data/vendor/libressl/apps/ocspcheck/CMakeLists.txt +44 -0
- data/vendor/libressl/apps/ocspcheck/Makefile.am +45 -0
- data/vendor/libressl/apps/ocspcheck/compat/.gitignore +0 -0
- data/vendor/libressl/apps/openssl/CMakeLists.txt +97 -0
- data/vendor/libressl/apps/openssl/Makefile.am +108 -0
- data/vendor/libressl/apps/openssl/apps_win.c +138 -0
- data/vendor/libressl/apps/openssl/certhash_win.c +13 -0
- data/vendor/libressl/apps/openssl/compat/clock_gettime_osx.c +26 -0
- data/vendor/libressl/apps/openssl/compat/poll_win.c +329 -0
- data/vendor/libressl/appveyor.yml +53 -0
- data/vendor/libressl/autogen.sh +15 -0
- data/vendor/libressl/check-release.sh +86 -0
- data/vendor/libressl/cmake_export_symbol.cmake +71 -0
- data/vendor/libressl/cmake_uninstall.cmake.in +36 -0
- data/vendor/libressl/config +17 -0
- data/vendor/libressl/configure.ac +165 -0
- data/vendor/libressl/crypto/CMakeLists.txt +863 -0
- data/vendor/libressl/crypto/Makefile.am +962 -0
- data/vendor/libressl/crypto/Makefile.am.arc4random +46 -0
- data/vendor/libressl/crypto/Makefile.am.elf-mips +14 -0
- data/vendor/libressl/crypto/Makefile.am.elf-mips64 +14 -0
- data/vendor/libressl/crypto/Makefile.am.elf-x86_64 +35 -0
- data/vendor/libressl/crypto/Makefile.am.macosx-x86_64 +35 -0
- data/vendor/libressl/crypto/Makefile.am.masm-x86_64 +22 -0
- data/vendor/libressl/crypto/Makefile.am.mingw64-x86_64 +23 -0
- data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_darwin.c +60 -0
- data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_linux.c +62 -0
- data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_none.c +26 -0
- data/vendor/libressl/crypto/arch/aarch64/crypto_cpu_caps_windows.c +36 -0
- data/vendor/libressl/crypto/arch/loongarch64/crypto_arch.h +21 -0
- data/vendor/libressl/crypto/arch/mips/crypto_arch.h +21 -0
- data/vendor/libressl/crypto/bn/arch/loongarch64/bn_arch.h +23 -0
- data/vendor/libressl/crypto/bn/arch/mips/bn_arch.h +24 -0
- data/vendor/libressl/crypto/compat/.gitignore +31 -0
- data/vendor/libressl/crypto/compat/arc4random.h +41 -0
- data/vendor/libressl/crypto/compat/b_win.c +55 -0
- data/vendor/libressl/crypto/compat/bsd-asprintf.c +96 -0
- data/vendor/libressl/crypto/compat/crypto_lock_win.c +56 -0
- data/vendor/libressl/crypto/compat/explicit_bzero_win.c +13 -0
- data/vendor/libressl/crypto/compat/freezero.c +32 -0
- data/vendor/libressl/crypto/compat/getdelim.c +78 -0
- data/vendor/libressl/crypto/compat/getline.c +40 -0
- data/vendor/libressl/crypto/compat/getopt_long.c +528 -0
- data/vendor/libressl/crypto/compat/getpagesize.c +18 -0
- data/vendor/libressl/crypto/compat/getprogname_linux.c +23 -0
- data/vendor/libressl/crypto/compat/getprogname_unimpl.c +7 -0
- data/vendor/libressl/crypto/compat/getprogname_windows.c +13 -0
- data/vendor/libressl/crypto/compat/posix_win.c +296 -0
- data/vendor/libressl/crypto/compat/syslog_r.c +19 -0
- data/vendor/libressl/crypto/compat/ui_openssl_win.c +334 -0
- data/vendor/libressl/dist.sh +22 -0
- data/vendor/libressl/gen-coverage-report.sh +58 -0
- data/vendor/libressl/gen-openbsd-tags.sh +20 -0
- data/vendor/libressl/include/CMakeLists.txt +61 -0
- data/vendor/libressl/include/Makefile.am +79 -0
- data/vendor/libressl/include/arch/loongarch64/opensslconf.h +150 -0
- data/vendor/libressl/include/arch/mips/opensslconf.h +150 -0
- data/vendor/libressl/include/compat/arpa/inet.h +15 -0
- data/vendor/libressl/include/compat/arpa/nameser.h +25 -0
- data/vendor/libressl/include/compat/cet.h +19 -0
- data/vendor/libressl/include/compat/dirent.h +17 -0
- data/vendor/libressl/include/compat/dirent_msvc.h +611 -0
- data/vendor/libressl/include/compat/endian.h +161 -0
- data/vendor/libressl/include/compat/err.h +95 -0
- data/vendor/libressl/include/compat/fcntl.h +32 -0
- data/vendor/libressl/include/compat/getopt.h +50 -0
- data/vendor/libressl/include/compat/limits.h +25 -0
- data/vendor/libressl/include/compat/netdb.h +10 -0
- data/vendor/libressl/include/compat/netinet/in.h +19 -0
- data/vendor/libressl/include/compat/netinet/ip.h +49 -0
- data/vendor/libressl/include/compat/netinet/tcp.h +10 -0
- data/vendor/libressl/include/compat/poll.h +63 -0
- data/vendor/libressl/include/compat/pthread.h +122 -0
- data/vendor/libressl/include/compat/readpassphrase.h +44 -0
- data/vendor/libressl/include/compat/resolv.h +24 -0
- data/vendor/libressl/include/compat/stdint.h +31 -0
- data/vendor/libressl/include/compat/stdio.h +65 -0
- data/vendor/libressl/include/compat/stdlib.h +57 -0
- data/vendor/libressl/include/compat/string.h +98 -0
- data/vendor/libressl/include/compat/sys/_null.h +18 -0
- data/vendor/libressl/include/compat/sys/ioctl.h +11 -0
- data/vendor/libressl/include/compat/sys/mman.h +19 -0
- data/vendor/libressl/include/compat/sys/param.h +15 -0
- data/vendor/libressl/include/compat/sys/queue.h +536 -0
- data/vendor/libressl/include/compat/sys/select.h +10 -0
- data/vendor/libressl/include/compat/sys/socket.h +18 -0
- data/vendor/libressl/include/compat/sys/stat.h +129 -0
- data/vendor/libressl/include/compat/sys/time.h +37 -0
- data/vendor/libressl/include/compat/sys/tree.h +1006 -0
- data/vendor/libressl/include/compat/sys/types.h +69 -0
- data/vendor/libressl/include/compat/sys/uio.h +17 -0
- data/vendor/libressl/include/compat/syslog.h +38 -0
- data/vendor/libressl/include/compat/time.h +59 -0
- data/vendor/libressl/include/compat/unistd.h +83 -0
- data/vendor/libressl/include/compat/win32netcompat.h +57 -0
- data/vendor/libressl/include/openssl/Makefile.am.tpl +45 -0
- data/vendor/libressl/libcrypto.pc.in +28 -0
- data/vendor/libressl/libressl.pub +2 -0
- data/vendor/libressl/libssl.pc.in +28 -0
- data/vendor/libressl/libtls.pc.in +28 -0
- data/vendor/libressl/m4/ax_add_fortify_source.m4 +80 -0
- data/vendor/libressl/m4/ax_check_compile_flag.m4 +53 -0
- data/vendor/libressl/m4/check-hardening-options.m4 +110 -0
- data/vendor/libressl/m4/check-libc.m4 +189 -0
- data/vendor/libressl/m4/check-os-options.m4 +181 -0
- data/vendor/libressl/m4/disable-compiler-warnings.m4 +44 -0
- data/vendor/libressl/man/CMakeLists.txt +26 -0
- data/vendor/libressl/man/links +2780 -0
- data/vendor/libressl/man/update_links.sh +25 -0
- data/vendor/libressl/openssl.pc.in +11 -0
- data/vendor/libressl/patches/bn_shift.patch +34 -0
- data/vendor/libressl/patches/crypto_arch.h.patch +34 -0
- data/vendor/libressl/patches/crypto_namespace.h.patch +22 -0
- data/vendor/libressl/patches/netcat.c.patch +178 -0
- data/vendor/libressl/patches/openssl.c.patch +12 -0
- data/vendor/libressl/patches/opensslfeatures.h.patch +49 -0
- data/vendor/libressl/patches/patch-amd64-crypto-cpu-caps.c.patch +20 -0
- data/vendor/libressl/patches/patch-i386-crypto-cpu-caps.c.patch +20 -0
- data/vendor/libressl/patches/speed.c.patch +114 -0
- data/vendor/libressl/patches/ssl_namespace.h.patch +21 -0
- data/vendor/libressl/patches/tls.h.patch +16 -0
- data/vendor/libressl/patches/tls_config.c.patch +15 -0
- data/vendor/libressl/patches/win32_amd64_bn_arch.h.patch +28 -0
- data/vendor/libressl/patches/windows_headers.patch +80 -0
- data/vendor/libressl/scripts/config.guess +1774 -0
- data/vendor/libressl/scripts/config.sub +1907 -0
- data/vendor/libressl/scripts/i686-w64-mingw32.cmake +9 -0
- data/vendor/libressl/scripts/test +210 -0
- data/vendor/libressl/scripts/wrap-compiler-for-flag-check +31 -0
- data/vendor/libressl/scripts/x86_64-w64-mingw32.cmake +9 -0
- data/vendor/libressl/ssl/CMakeLists.txt +183 -0
- data/vendor/libressl/ssl/Makefile.am +187 -0
- data/vendor/libressl/tests/CMakeLists.txt +970 -0
- data/vendor/libressl/tests/Makefile.am +944 -0
- data/vendor/libressl/tests/aeadtest.sh +30 -0
- data/vendor/libressl/tests/arc4randomforktest.sh +21 -0
- data/vendor/libressl/tests/asn1time_small.test +10 -0
- data/vendor/libressl/tests/cmake/CMakeLists.txt +52 -0
- data/vendor/libressl/tests/cmake/crypto.c +7 -0
- data/vendor/libressl/tests/cmake/ssl.c +6 -0
- data/vendor/libressl/tests/cmake/tls.c +6 -0
- data/vendor/libressl/tests/compat/pipe2.c +186 -0
- data/vendor/libressl/tests/dtlstest.sh +28 -0
- data/vendor/libressl/tests/evptest.sh +22 -0
- data/vendor/libressl/tests/keypairtest.sh +27 -0
- data/vendor/libressl/tests/mlkem_tests.sh +39 -0
- data/vendor/libressl/tests/ocsptest.bat +25 -0
- data/vendor/libressl/tests/ocsptest.sh +23 -0
- data/vendor/libressl/tests/openssl.cnf +29 -0
- data/vendor/libressl/tests/optionstest.c +381 -0
- data/vendor/libressl/tests/pidwraptest.c +85 -0
- data/vendor/libressl/tests/pidwraptest.sh +26 -0
- data/vendor/libressl/tests/quictest.bat +27 -0
- data/vendor/libressl/tests/quictest.sh +30 -0
- data/vendor/libressl/tests/renegotiation_test.bat +27 -0
- data/vendor/libressl/tests/renegotiation_test.sh +30 -0
- data/vendor/libressl/tests/rfc5280time_small.test +10 -0
- data/vendor/libressl/tests/servertest.bat +27 -0
- data/vendor/libressl/tests/servertest.sh +30 -0
- data/vendor/libressl/tests/shutdowntest.bat +27 -0
- data/vendor/libressl/tests/shutdowntest.sh +30 -0
- data/vendor/libressl/tests/ssltest.bat +32 -0
- data/vendor/libressl/tests/ssltest.sh +48 -0
- data/vendor/libressl/tests/testdsa.bat +47 -0
- data/vendor/libressl/tests/testdsa.sh +57 -0
- data/vendor/libressl/tests/testenc.bat +85 -0
- data/vendor/libressl/tests/testenc.sh +93 -0
- data/vendor/libressl/tests/testrsa.bat +47 -0
- data/vendor/libressl/tests/testrsa.sh +57 -0
- data/vendor/libressl/tests/testssl.bat +171 -0
- data/vendor/libressl/tests/tlstest.bat +27 -0
- data/vendor/libressl/tests/tlstest.sh +28 -0
- data/vendor/libressl/tls/CMakeLists.txt +125 -0
- data/vendor/libressl/tls/Makefile.am +76 -0
- data/vendor/libressl/tls/compat/ftruncate.c +17 -0
- data/vendor/libressl/tls/compat/pread.c +29 -0
- data/vendor/libressl/tls/compat/pwrite.c +29 -0
- data/vendor/libressl/update.sh +460 -0
- data/vendor/liburing/.github/workflows/ci.yml +8 -0
- data/vendor/liburing/configure +23 -2
- data/vendor/liburing/examples/helpers.c +1 -1
- data/vendor/liburing/examples/helpers.h +1 -1
- data/vendor/liburing/examples/reg-wait.c +3 -3
- data/vendor/liburing/examples/zcrx.c +5 -5
- data/vendor/liburing/liburing.spec +1 -1
- data/vendor/liburing/src/include/liburing/io_uring.h +16 -0
- data/vendor/liburing/src/include/liburing.h +20 -4
- data/vendor/liburing/src/lib.h +2 -4
- data/vendor/liburing/src/liburing-ffi.map +7 -0
- data/vendor/liburing/src/liburing.map +7 -0
- data/vendor/liburing/src/register.c +5 -0
- data/vendor/liburing/src/sanitize.c +5 -4
- data/vendor/liburing/src/setup.c +43 -28
- data/vendor/liburing/test/Makefile +7 -0
- data/vendor/liburing/test/cmd-discard.c +2 -2
- data/vendor/liburing/test/evfd-short-read.c +84 -0
- data/vendor/liburing/test/fdinfo-sqpoll.c +117 -0
- data/vendor/liburing/test/fdinfo.c +1 -1
- data/vendor/liburing/test/fixed-buf-merge.c +2 -2
- data/vendor/liburing/test/futex-kill.c +135 -0
- data/vendor/liburing/test/helpers.c +1 -1
- data/vendor/liburing/test/helpers.h +1 -1
- data/vendor/liburing/test/init-mem.c +50 -12
- data/vendor/liburing/test/io_uring_passthrough.c +25 -6
- data/vendor/liburing/test/msg-ring.c +123 -9
- data/vendor/liburing/test/recv-bundle-short-ooo.c +16 -1
- data/vendor/liburing/test/recv-inc-ooo.c +411 -0
- data/vendor/liburing/test/recv-mshot-fair.c +513 -0
- data/vendor/liburing/test/reg-wait.c +14 -14
- data/vendor/liburing/test/send-zerocopy.c +4 -4
- data/vendor/liburing/test/timerfd-short-read.c +81 -0
- data/vendor/liburing/test/timestamp.c +382 -0
- data/vendor/liburing/test/zcrx.c +22 -22
- metadata +222 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18144dad22716ba83fde0f2ec1d3bffbb1a13684044f99f279eba183a70e7181
|
4
|
+
data.tar.gz: 0e742fa4e8ac06475fa7bfab120239863b76f47f5ca33c2a9cc3d0c26ef27bc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe981430bc6dace32cb166e3e8177ab5b4cf90f86021ee14990fa01b573459fbace2f17484e2307a9cf8ee83b59b547ae5e2c051774fcb8a444297293214d1e4
|
7
|
+
data.tar.gz: 8cc7d29d54de95ab70d197db9c1a035d6302750ca86d2ecfb94599e9bed5e3b4f1119eefc8e4804f89f09a20242cd35c0fe277b1a214f2742fce7642b6b83c97
|
data/.github/FUNDING.yml
ADDED
data/.gitmodules
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
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
|
+
|
9
|
+
# 2025-07-06 Version 0.16
|
10
|
+
|
11
|
+
- Load UM version on require
|
12
|
+
|
1
13
|
# 2025-06-24 Version 0.15
|
2
14
|
|
3
15
|
- Add support for sleeping forever when sleep duration is lte 0
|
data/TODO.md
CHANGED
@@ -1,9 +1,18 @@
|
|
1
|
-
|
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
|
-
|
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
|
-
|
34
|
+
## streams
|
26
35
|
|
27
36
|
We're still missing:
|
28
37
|
|
data/examples/bm_send.rb
ADDED
@@ -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_stream_class.c
CHANGED
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 (
|
89
|
-
|
90
|
-
|
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
|
+
}
|
data/lib/uringmachine/version.rb
CHANGED
data/lib/uringmachine.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require 'um_ext'
|
4
|
+
require 'uringmachine/version'
|
5
|
+
require 'uringmachine/dns_resolver'
|
5
6
|
|
6
7
|
UM = UringMachine
|
7
8
|
|
@@ -63,7 +64,7 @@ class UringMachine
|
|
63
64
|
# cleanup
|
64
65
|
@@fiber_map.delete(fiber)
|
65
66
|
self.notify_done_listeners(fiber)
|
66
|
-
|
67
|
+
|
67
68
|
# transfer control to UM scheduler
|
68
69
|
self.yield
|
69
70
|
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
|