pigeonhole-db 1.1.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.
- checksums.yaml +7 -0
- data/Cargo.lock +899 -0
- data/Cargo.toml +45 -0
- data/LICENSE +21 -0
- data/README.md +22 -0
- data/extconf.rb +12 -0
- data/lib/pigeonhole/api.rb +615 -0
- data/lib/pigeonhole/index.rb +208 -0
- data/lib/pigeonhole/memory.rb +507 -0
- data/lib/pigeonhole/version.rb +6 -0
- data/lib/pigeonhole-db.rb +6 -0
- data/lib/pigeonhole.rb +47 -0
- data/sig/pigeonhole.rbs +1484 -0
- data/src/budget.rs +205 -0
- data/src/classes.rs +279 -0
- data/src/convert.rs +192 -0
- data/src/db.rs +685 -0
- data/src/error.rs +151 -0
- data/src/feed.rs +316 -0
- data/src/fork.rs +64 -0
- data/src/gvl.rs +112 -0
- data/src/index.rs +1157 -0
- data/src/lib.rs +534 -0
- data/src/memory.rs +2178 -0
- data/src/read.rs +312 -0
- data/src/table.rs +1161 -0
- data/src/vector.rs +262 -0
- data/src/walk.rs +406 -0
- data/vendor/bundle/ruby/3.4.0/bin/minitest +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rb-sys-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/cache/drb-2.2.3.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/minitest-6.0.6.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/prism-1.9.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-1.3.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-dock-1.12.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rb_sys-0.9.130.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rbs-4.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/toml-rb-6.0.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/tsort-0.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem_make.out +44 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/mkmf.log +74 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem_make.out +41 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/mkmf.log +102 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/drb.gemspec +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/acl.rb +239 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/drb.rb +1993 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/eq.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extserv.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extservm.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/gw.rb +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/observer.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/ssl.rb +354 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/timeridconv.rb +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/unix.rb +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/version.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/weakidconv.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/History.rdoc +1860 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Manifest.txt +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/README.rdoc +763 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Rakefile +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/bin/minitest +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/design_rationale.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/hoe/minitest.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/assertions.rb +821 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/autorun.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/benchmark.rb +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/bisect.rb +304 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/complete.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/compress.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/error_on_warning.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/expectations.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/find_minimal_combination.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/hell.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/manual_plugins.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/parallel.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/path_expander.rb +432 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride_plugin.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server_plugin.rb +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/spec.rb +324 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint.rb +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint_plugin.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test.rb +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test_task.rb +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest.rb +1232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/metametameta.rb +150 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_bisect.rb +249 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_find_minimal_combination.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_assertions.rb +1729 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_benchmark.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_reporter.rb +437 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_spec.rb +1095 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test.rb +1295 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test_task.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_path_expander.rb +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_server.rb +146 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/BSDmakefile +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CHANGELOG.md +786 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CODE_OF_CONDUCT.md +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CONTRIBUTING.md +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/LICENSE.md +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/Makefile +116 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/README.md +143 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/config.yml +4739 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/build_system.md +119 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/configuration.md +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/cruby_compilation.md +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/design.md +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/encoding.md +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/fuzzing.md +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/heredocs.md +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/javascript.md +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/local_variable_depth.md +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/mapping.md +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parser_translation.md +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parsing_rules.md +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/releasing.md +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/relocation.md +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ripper_translation.md +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_api.md +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_parser_translation.md +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/serialization.md +233 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/testing.md +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_node.c +6945 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_pack.c +276 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extconf.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.c +1427 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.h +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/ast.h +8254 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/defines.h +260 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/diagnostic.h +458 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/encoding.h +283 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/node.h +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/options.h +488 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/pack.h +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/parser.h +936 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/prettyprint.h +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/regexp.h +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/static_literals.h +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_buffer.h +236 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_char.h +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_constant_pool.h +218 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_integer.h +130 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_list.h +103 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_memchr.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_newline_list.h +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_string.h +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strncasecmp.h +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strpbrk.h +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/version.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism.h +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/compiler.rb +801 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/desugar_compiler.rb +392 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dispatcher.rb +2210 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dot_visitor.rb +4767 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dsl.rb +1003 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/ffi.rb +578 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/inspect_visitor.rb +2393 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/lex_compat.rb +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/mutation_compiler.rb +772 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node.rb +19966 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node_ext.rb +511 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pack.rb +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/comments.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/errors.rb +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/newlines.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result.rb +907 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pattern.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/append_as_bytes.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/byteindex.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/scan_byte.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/unpack1.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/warn.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/reflection.rb +416 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/relocation.rb +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/serialize.rb +2400 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/string_query.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/builder.rb +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/compiler.rb +2234 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/lexer.rb +820 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser.rb +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_current.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_versions.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/filter.rb +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/lexer.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/sexp.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/shim.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper.rb +3520 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ruby_parser.rb +1964 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/visitor.rb +813 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism.rb +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/prism.gemspec +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/compiler.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/dsl.rbi +524 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/inspect_visitor.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node.rbi +8750 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node_ext.rbi +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/parse_result.rbi +404 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/reflection.rbi +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/string_query.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser.rbi +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser_versions.rbi +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/ripper.rbi +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/visitor.rbi +473 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism.rbi +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/compiler.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dispatcher.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dot_visitor.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dsl.rbs +351 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/inspect_visitor.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/lex_compat.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/mutation_compiler.rbs +159 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node.rbs +4042 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node_ext.rbs +149 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pack.rbs +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result/comments.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pattern.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/reflection.rbs +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/relocation.rbs +185 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/serialize.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/string_query.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/visitor.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism.rbs +272 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/diagnostic.c +854 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/encoding.c +5340 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/node.c +8685 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/options.c +338 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/pack.c +509 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prettyprint.c +8957 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prism.c +22679 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/regexp.c +790 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/serialize.c +2274 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/static_literals.c +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/token_type.c +703 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_buffer.c +357 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_char.c +318 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_constant_pool.c +342 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_integer.c +670 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_list.c +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_memchr.c +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_newline_list.c +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_string.c +381 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strncasecmp.c +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strpbrk.c +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/History.md +708 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/LICENSE.txt +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/README.md +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Rakefile +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/appveyor.yml +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/bin/rake-compiler +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/cucumber.yml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/compile.feature +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-compile.feature +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package-multi.feature +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package.feature +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-compile.feature +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-no-native-compile.feature +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-package.feature +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/package.feature +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/compilation.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/cross_compilation.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/execution.rb +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/folders.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/gem.rb +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/java_compilation.rb +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/env.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/file_template_helpers.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/generator_helpers.rb +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/platform_extension_helpers.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/baseextensiontask.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/compiler_config.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensioncompiler.rb +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensiontask.rb +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/javaextensiontask.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bin/cross-ruby.rake +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bootstrap.rake +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/common.rake +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/cucumber.rake +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/gem.rake +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/rspec.rake +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-APACHE +190 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-MIT +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/README.md +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/certs/ianks.pem +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/exe/rb-sys-dock +495 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/config.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/metadata.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder/link_flag_converter.rb +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder.rb +370 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/error.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/extensiontask.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf/config.rb +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf.rb +413 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info/data.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/util/logger.rb +73 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/CHANGELOG.md +2463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Dockerfile.jruby +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/README.md +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Rakefile +1213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Steepfile +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/config.yml +920 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/array.rbs +4205 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/basic_object.rbs +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/binding.rbs +148 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/builtin.rbs +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/class.rbs +223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/comparable.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/complex.rbs +812 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/constants.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/data.rbs +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/dir.rbs +993 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/encoding.rbs +1368 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerable.rbs +2506 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/product.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator.rbs +705 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/env.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errno.rbs +682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errors.rbs +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/exception.rbs +485 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/false_class.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber.rbs +570 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file.rbs +2045 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_constants.rbs +463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_stat.rbs +534 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_test.rbs +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/float.rbs +1292 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/gc.rbs +788 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/global_variables.rbs +184 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/hash.rbs +2183 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/integer.rbs +1374 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/buffer.rbs +995 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/wait.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io.rbs +3473 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/kernel.rbs +3172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/marshal.rbs +207 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/match_data.rbs +637 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/math.rbs +770 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/method.rbs +422 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/module.rbs +1856 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/nil_class.rbs +210 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/numeric.rbs +832 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space/weak_key_map.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/pathname.rbs +1312 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/proc.rbs +905 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/process.rbs +2316 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ractor.rbs +914 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/random.rbs +255 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/range.rbs +1209 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rational.rbs +502 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rb_config.rbs +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/ops.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/argf.rbs +1236 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/env_class.rbs +1214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/main_class.rbs +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/random.rbs +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/refinement.rbs +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/regexp.rbs +1974 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby_vm.rbs +809 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/basic_specification.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/config_file.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/dependency_installer.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/errors.rbs +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/installer.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/path_support.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/platform.rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/request_set.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/requirement.rbs +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/rubygems.rbs +1108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/source_list.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/specification.rbs +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/stream_ui.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/uninstaller.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/version.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/set.rbs +751 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/signal.rbs +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/string.rbs +5532 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/struct.rbs +668 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/symbol.rbs +482 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread.rbs +1821 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread_group.rbs +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/time.rbs +1793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/trace_point.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/true_class.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/unbound_method.rbs +337 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/warning.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/CONTRIBUTING.md +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/aliases.md +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/architecture.md +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/collection.md +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/config.md +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/data_and_struct.md +86 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/encoding.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/gem.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/inline.md +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rbs_by_example.md +309 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/release.md +303 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/repo.md +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rust.md +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/sigs.md +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/stdlib.md +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/syntax.md +952 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/tools.md +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/type_fingerprint.md +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/wasm_serialization.md +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/exe/rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.c +1870 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.h +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.c +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.h +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/compat.h +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/extconf.rb +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.c +299 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.h +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/main.c +649 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_extension.h +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/goodcheck.yml +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/ast.h +1055 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/defines.h +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/lexer.h +208 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/location.h +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/parser.h +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/serialize.h +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/string.h +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_allocator.h +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_assert.h +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_buffer.h +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_constant_pool.h +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_encoding.h +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_unescape.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs.h +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ancestor_graph.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/annotations.rb +199 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/formatter.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/annotation.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/comment.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/declarations.rb +472 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/directives.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/members.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/members.rb +762 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/type_param.rb +235 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/visitor.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/buffer.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/builtin_names.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/colored_io.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/diff.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/validate.rb +294 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli.rb +1253 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/cleaner.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/installer.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/base.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/git.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/local.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/constant.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition.rb +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/ancestor_builder.rb +681 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder.rb +1057 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/diff.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/class_entry.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/module_entry.rb +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/use_map.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment.rb +1028 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_loader.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_walker.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/errors.rb +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/factory.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/file_finder.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser.rb +568 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/location_aux.rb +170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/locator.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/method_type.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/namespace.rb +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/lex_result.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/token.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser_aux.rb +144 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/helpers.rb +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/node_usage.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rb.rb +816 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rbi.rb +793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/value_object_generator.rb +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime.rb +680 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/repository.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/rewriter.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/sorter.rb +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/source.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/substitution.rb +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/subtractor.rb +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/errors.rb +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/guaranteed.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/hook.rb +212 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/observer.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup_helper.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/tester.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/type_check.rb +457 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_dependency.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_regularity.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_name.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/types.rb +1646 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/convertibles.rb +177 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/spy.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/validator.rb +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/variance_calculator.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/vendorer.rb +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/deserializer.rb +213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/location.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/parser.rb +174 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/runtime.rb +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/serialization_schema.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/writer.rb +424 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_jars.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc/discover.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc_plugin/parser.rb +168 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/rbs.gemspec +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/annotation.json +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/comment.json +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/decls.json +326 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/function.json +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/location.json +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/members.json +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/methodType.json +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/typeParam.json +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/types.json +317 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_builder.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_graph.rbs +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/annotations.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/formatter.rbs +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_annotater.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_source.rbs +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotation.rbs +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/annotations.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/comment_block.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/declarations.rbs +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/members.rbs +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/buffer.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/builtin_names.rbs +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/colored_io.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/diff.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/validate.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/cleaner.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile.rbs +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile_generator.rbs +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/installer.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/sources.rbs +214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/comment.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/constant.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/declarations.rbs +274 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition.rbs +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition_builder.rbs +181 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/diff.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/directives.rbs +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/class_entry.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/module_entry.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment.rbs +286 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_loader.rbs +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_walker.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/errors.rbs +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/factory.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/file_finder.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser/comment_association.rbs +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser.rbs +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/location.rbs +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/locator.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/manifest.yaml +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/members.rbs +258 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_builder.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_types.rbs +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/namespace.rbs +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/parser.rbs +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/helpers.rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/node_usage.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rb.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rbi.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/runtime.rbs +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rbs.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rdoc/rbs.rbs +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/repository.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/constant_resolver.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/context.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/type_name_resolver.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rewriter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/bundler.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/enumerable.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/rubygems.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/sorter.rbs +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/source.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/substitution.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/subtractor.rbs +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/errors.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/guranteed.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/type_check.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_dependency.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_regularity.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_param.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/typename.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/types.rbs +588 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/convertibles.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/spy.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/type_assertions.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/with_aliases.rbs +136 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/use_map.rbs +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/util.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/validator.rbs +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/variance_calculator.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/vendorer.rbs +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/version.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/visitor.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/deserializer.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/serialization_schema.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/writer.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/ast.c +1644 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.c +3223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.re +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexstate.c +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/location.c +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/parser.c +4318 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/serialize.c +965 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/string.c +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_allocator.c +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_assert.c +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_buffer.c +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_constant_pool.c +268 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_encoding.c +21454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_unescape.c +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/array.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/base64/0/base64.rbs +355 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/core.rbs +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/coverage/0/coverage.rbs +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/csv.rbs +3776 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date.rbs +1598 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date_time.rbs +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/time.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/dbm/0/dbm.rbs +421 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/delegator.rbs +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/kernel.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/digest/0/digest.rbs +693 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/erb/0/erb.rbs +933 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/etc/0/etc.rbs +884 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/find/0/find.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/io-console/0/io-console.rbs +414 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ipaddr/0/ipaddr.rbs +431 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/json/0/json.rbs +1963 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/kconv/0/kconv.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/formatter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/log_device.rbs +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/logger.rbs +796 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/period.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/severity.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/kernel.rbs +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/monitor/0/monitor.rbs +363 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/net-http.rbs +5580 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/nkf/0/nkf.rbs +402 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/objspace/0/objspace.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/observable/0/observable.rbs +217 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open3/0/open3.rbs +606 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/openssl.rbs +12237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/optparse/0/optparse.rbs +1734 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pathname/0/pathname.rbs +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/pp.rbs +301 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pstore/0/pstore.rbs +608 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/core_ext.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/dbm.rbs +237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/psych.rbs +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/store.rbs +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pty/0/pty.rbs +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/code_object.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/comment.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/context.rbs +153 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/markup.rbs +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/options.rbs +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/parser.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/ri.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/store.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/top_level.rbs +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/resolv.rbs +1787 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ripper/0/ripper.rbs +1654 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/singleton/0/singleton.rbs +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/addrinfo.rbs +666 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/basic_socket.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/constants.rbs +2295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/ip_socket.rbs +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket.rbs +4170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket_error.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_server.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/udp_socket.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_server.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_socket.rbs +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/stringio/0/stringio.rbs +1682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/time/0/time.rbs +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/timeout/0/timeout.rbs +132 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/cyclic.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/interfaces.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/tsort.rbs +410 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/common.rbs +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/file.rbs +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ftp.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/generic.rbs +1111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/http.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/https.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldap.rbs +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldaps.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/mailto.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ws.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/wss.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/yaml.rbs +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/buf_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/data_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/deflate.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/error.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_writer.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/inflate.rbs +180 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/mem_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/need_dict.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_end.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/version_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zlib.rbs +449 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zstream.rbs +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/README.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/rbs_wasm.c +479 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/LICENSE +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/README.md +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/datetime.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/dumper.rb +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/errors.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/inline_table.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/keyvalue.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/parser.rb +296 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/string.rb +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table_array.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Gemfile +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/README.md +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Rakefile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/console +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/tsort.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/drb-2.2.3.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/minitest-6.0.6.gemspec +35 -0
- data/vendor/bundle/ruby/3.4.0/specifications/prism-1.9.0.gemspec +24 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-1.3.2.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rb_sys-0.9.130.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rbs-4.2.0.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/toml-rb-6.0.0.gemspec +27 -0
- data/vendor/bundle/ruby/3.4.0/specifications/tsort-0.2.0.gemspec +23 -0
- data/vendor/cache/Cargo.toml +21 -0
- data/vendor/cache/LICENSE +21 -0
- data/vendor/cache/README.md +5 -0
- data/vendor/cache/src/hash.rs +85 -0
- data/vendor/cache/src/lib.rs +751 -0
- data/vendor/cache/src/loom_tests.rs +340 -0
- data/vendor/cache/src/s3fifo.rs +648 -0
- data/vendor/cache/src/sync.rs +25 -0
- data/vendor/cache/src/tests.rs +260 -0
- data/vendor/compaction/Cargo.toml +32 -0
- data/vendor/compaction/LICENSE +21 -0
- data/vendor/compaction/README.md +5 -0
- data/vendor/compaction/src/blob.rs +478 -0
- data/vendor/compaction/src/cursor.rs +700 -0
- data/vendor/compaction/src/gc.rs +802 -0
- data/vendor/compaction/src/job.rs +861 -0
- data/vendor/compaction/src/lib.rs +102 -0
- data/vendor/compaction/src/merge.rs +995 -0
- data/vendor/compaction/src/picker.rs +681 -0
- data/vendor/compaction/src/resolver.rs +1346 -0
- data/vendor/engine/Cargo.toml +56 -0
- data/vendor/engine/LICENSE +21 -0
- data/vendor/engine/README.md +5 -0
- data/vendor/engine/src/admission.rs +421 -0
- data/vendor/engine/src/catalog.rs +1233 -0
- data/vendor/engine/src/check.rs +1386 -0
- data/vendor/engine/src/clock.rs +244 -0
- data/vendor/engine/src/clock_loom.rs +482 -0
- data/vendor/engine/src/close_gate.rs +325 -0
- data/vendor/engine/src/compact.rs +1509 -0
- data/vendor/engine/src/engine/hooks.rs +1654 -0
- data/vendor/engine/src/engine/info.rs +229 -0
- data/vendor/engine/src/engine.rs +6114 -0
- data/vendor/engine/src/error.rs +490 -0
- data/vendor/engine/src/feed.rs +960 -0
- data/vendor/engine/src/feed_reader.rs +1600 -0
- data/vendor/engine/src/flush.rs +839 -0
- data/vendor/engine/src/flushed_roots.rs +158 -0
- data/vendor/engine/src/flushed_through_loom.rs +77 -0
- data/vendor/engine/src/health.rs +201 -0
- data/vendor/engine/src/large.rs +372 -0
- data/vendor/engine/src/large_settle.rs +201 -0
- data/vendor/engine/src/lib.rs +112 -0
- data/vendor/engine/src/load_slot.rs +324 -0
- data/vendor/engine/src/maintenance.rs +935 -0
- data/vendor/engine/src/manifest/flight.rs +563 -0
- data/vendor/engine/src/manifest.rs +1516 -0
- data/vendor/engine/src/nonblocking.rs +603 -0
- data/vendor/engine/src/options.rs +334 -0
- data/vendor/engine/src/position.rs +125 -0
- data/vendor/engine/src/purge_guard.rs +220 -0
- data/vendor/engine/src/read/keys.rs +1049 -0
- data/vendor/engine/src/read/knn.rs +423 -0
- data/vendor/engine/src/read/reduce.rs +2057 -0
- data/vendor/engine/src/read/traverse.rs +1013 -0
- data/vendor/engine/src/read.rs +2429 -0
- data/vendor/engine/src/row_cache.rs +1101 -0
- data/vendor/engine/src/shard/tablets.rs +3582 -0
- data/vendor/engine/src/shard.rs +12215 -0
- data/vendor/engine/src/snapshot.rs +1429 -0
- data/vendor/engine/src/source.rs +1379 -0
- data/vendor/engine/src/timer_state.rs +226 -0
- data/vendor/engine/src/waker.rs +124 -0
- data/vendor/engine/src/watermark_waiters.rs +674 -0
- data/vendor/engine/src/write.rs +1321 -0
- data/vendor/format/Cargo.toml +40 -0
- data/vendor/format/LICENSE +21 -0
- data/vendor/format/README.md +5 -0
- data/vendor/format/src/blob.rs +101 -0
- data/vendor/format/src/block.rs +1120 -0
- data/vendor/format/src/bloom.rs +456 -0
- data/vendor/format/src/buckets.rs +552 -0
- data/vendor/format/src/bytes.rs +101 -0
- data/vendor/format/src/checksum.rs +132 -0
- data/vendor/format/src/compress.rs +196 -0
- data/vendor/format/src/cursor.rs +110 -0
- data/vendor/format/src/distance.rs +598 -0
- data/vendor/format/src/error.rs +93 -0
- data/vendor/format/src/exact.rs +602 -0
- data/vendor/format/src/feed.rs +285 -0
- data/vendor/format/src/filter.rs +157 -0
- data/vendor/format/src/half.rs +182 -0
- data/vendor/format/src/hash.rs +127 -0
- data/vendor/format/src/hll.rs +500 -0
- data/vendor/format/src/ids.rs +95 -0
- data/vendor/format/src/key.rs +620 -0
- data/vendor/format/src/kind_params.rs +101 -0
- data/vendor/format/src/lib.rs +54 -0
- data/vendor/format/src/manifest.rs +1287 -0
- data/vendor/format/src/roaring.rs +865 -0
- data/vendor/format/src/scan.rs +297 -0
- data/vendor/format/src/shm.rs +805 -0
- data/vendor/format/src/sst.rs +233 -0
- data/vendor/format/src/superblock.rs +345 -0
- data/vendor/format/src/value.rs +163 -0
- data/vendor/format/src/varint.rs +87 -0
- data/vendor/format/src/vector.rs +936 -0
- data/vendor/format/src/version.rs +92 -0
- data/vendor/format/src/wal.rs +999 -0
- data/vendor/io/Cargo.toml +29 -0
- data/vendor/io/LICENSE +21 -0
- data/vendor/io/README.md +5 -0
- data/vendor/io/src/async_poll.rs +44 -0
- data/vendor/io/src/buf.rs +694 -0
- data/vendor/io/src/completion.rs +444 -0
- data/vendor/io/src/error.rs +110 -0
- data/vendor/io/src/file.rs +206 -0
- data/vendor/io/src/lib.rs +53 -0
- data/vendor/io/src/nowait.rs +256 -0
- data/vendor/io/src/os/mod.rs +149 -0
- data/vendor/io/src/os/unix.rs +897 -0
- data/vendor/io/src/os/windows.rs +552 -0
- data/vendor/io/src/own.rs +257 -0
- data/vendor/io/src/pread.rs +854 -0
- data/vendor/io/src/ring_wake.rs +113 -0
- data/vendor/io/src/shared.rs +410 -0
- data/vendor/io/src/sim.rs +1545 -0
- data/vendor/io/src/sys.rs +214 -0
- data/vendor/io/src/uring.rs +1839 -0
- data/vendor/io/src/vfs.rs +154 -0
- data/vendor/memory/Cargo.toml +34 -0
- data/vendor/memory/LICENSE +21 -0
- data/vendor/memory/README.md +11 -0
- data/vendor/memory/src/consolidate.rs +640 -0
- data/vendor/memory/src/dedup.rs +231 -0
- data/vendor/memory/src/error.rs +131 -0
- data/vendor/memory/src/feed_loop.rs +572 -0
- data/vendor/memory/src/forget.rs +724 -0
- data/vendor/memory/src/hooks.rs +109 -0
- data/vendor/memory/src/ivf.rs +204 -0
- data/vendor/memory/src/layout.rs +340 -0
- data/vendor/memory/src/lib.rs +61 -0
- data/vendor/memory/src/recall.rs +1182 -0
- data/vendor/memory/src/store.rs +1785 -0
- data/vendor/memory/src/watch.rs +339 -0
- data/vendor/memtable/Cargo.toml +24 -0
- data/vendor/memtable/LICENSE +21 -0
- data/vendor/memtable/README.md +5 -0
- data/vendor/memtable/src/lib.rs +1658 -0
- data/vendor/memtable/src/loom_tests.rs +274 -0
- data/vendor/memtable/src/mem.rs +344 -0
- data/vendor/memtable/src/tests.rs +1061 -0
- data/vendor/pager/Cargo.toml +23 -0
- data/vendor/pager/LICENSE +21 -0
- data/vendor/pager/README.md +5 -0
- data/vendor/pager/src/alloc.rs +1008 -0
- data/vendor/pager/src/lib.rs +1710 -0
- data/vendor/pigeonhole/Cargo.toml +42 -0
- data/vendor/pigeonhole/LICENSE +21 -0
- data/vendor/pigeonhole/README.md +99 -0
- data/vendor/pigeonhole/src/cell.rs +829 -0
- data/vendor/pigeonhole/src/check.rs +368 -0
- data/vendor/pigeonhole/src/db.rs +2324 -0
- data/vendor/pigeonhole/src/doc_support.rs +89 -0
- data/vendor/pigeonhole/src/error.rs +257 -0
- data/vendor/pigeonhole/src/feed.rs +696 -0
- data/vendor/pigeonhole/src/info.rs +425 -0
- data/vendor/pigeonhole/src/lib.rs +202 -0
- data/vendor/pigeonhole/src/merge.rs +135 -0
- data/vendor/pigeonhole/src/metrics.rs +476 -0
- data/vendor/pigeonhole/src/nonblocking.rs +666 -0
- data/vendor/pigeonhole/src/options.rs +2075 -0
- data/vendor/pigeonhole/src/read/budget.rs +584 -0
- data/vendor/pigeonhole/src/read.rs +2463 -0
- data/vendor/pigeonhole/src/recovery.rs +876 -0
- data/vendor/pigeonhole/src/retry.rs +358 -0
- data/vendor/pigeonhole/src/set.rs +103 -0
- data/vendor/pigeonhole/src/table.rs +861 -0
- data/vendor/pigeonhole/src/vector.rs +351 -0
- data/vendor/pigeonhole/src/write.rs +2815 -0
- data/vendor/runtime/Cargo.toml +21 -0
- data/vendor/runtime/LICENSE +21 -0
- data/vendor/runtime/README.md +5 -0
- data/vendor/runtime/src/completion.rs +629 -0
- data/vendor/runtime/src/drivers.rs +1175 -0
- data/vendor/runtime/src/lib.rs +1546 -0
- data/vendor/runtime/src/pool.rs +992 -0
- data/vendor/runtime/src/sched.rs +809 -0
- data/vendor/runtime/src/signal.rs +532 -0
- data/vendor/runtime/src/submit_gate.rs +144 -0
- data/vendor/shm/Cargo.toml +24 -0
- data/vendor/shm/LICENSE +21 -0
- data/vendor/shm/README.md +5 -0
- data/vendor/shm/src/lib.rs +427 -0
- data/vendor/shm/src/lock.rs +153 -0
- data/vendor/shm/src/region.rs +1609 -0
- data/vendor/sst/Cargo.toml +26 -0
- data/vendor/sst/LICENSE +21 -0
- data/vendor/sst/README.md +5 -0
- data/vendor/sst/src/blob.rs +380 -0
- data/vendor/sst/src/iter.rs +803 -0
- data/vendor/sst/src/lib.rs +695 -0
- data/vendor/sst/src/reader.rs +814 -0
- data/vendor/sst/src/writer.rs +596 -0
- data/vendor/text/Cargo.toml +26 -0
- data/vendor/text/LICENSE +21 -0
- data/vendor/text/README.md +9 -0
- data/vendor/text/src/error.rs +108 -0
- data/vendor/text/src/fuzzy.rs +265 -0
- data/vendor/text/src/highlight.rs +236 -0
- data/vendor/text/src/index.rs +1152 -0
- data/vendor/text/src/layout.rs +424 -0
- data/vendor/text/src/lib.rs +75 -0
- data/vendor/text/src/maxscore.rs +658 -0
- data/vendor/text/src/query.rs +450 -0
- data/vendor/text/src/search.rs +569 -0
- data/vendor/text/src/sloppy.rs +460 -0
- data/vendor/text/src/tokenizer.rs +163 -0
- data/vendor/vector/Cargo.toml +28 -0
- data/vendor/vector/LICENSE +21 -0
- data/vendor/vector/README.md +9 -0
- data/vendor/vector/src/error.rs +63 -0
- data/vendor/vector/src/half.rs +167 -0
- data/vendor/vector/src/hooks.rs +135 -0
- data/vendor/vector/src/index.rs +2690 -0
- data/vendor/vector/src/layout.rs +102 -0
- data/vendor/vector/src/lib.rs +52 -0
- data/vendor/vector/src/point.rs +500 -0
- data/vendor/vector/src/rebalancer.rs +200 -0
- data/vendor/vector/src/registry.rs +81 -0
- data/vendor/wal/Cargo.toml +25 -0
- data/vendor/wal/LICENSE +21 -0
- data/vendor/wal/README.md +5 -0
- data/vendor/wal/src/feed.rs +610 -0
- data/vendor/wal/src/foreground.rs +122 -0
- data/vendor/wal/src/lib.rs +458 -0
- data/vendor/wal/src/mem.rs +166 -0
- data/vendor/wal/src/recovery.rs +426 -0
- data/vendor/wal/src/stream.rs +2382 -0
- metadata +1310 -0
|
@@ -0,0 +1,1546 @@
|
|
|
1
|
+
//! Thread-per-core shard runtime for Pigeonhole.
|
|
2
|
+
//!
|
|
3
|
+
//! The runtime runs N shard loops. Each loop owns a [`ShardHandler`] (the engine's per-shard
|
|
4
|
+
//! state), drains its MPSC queue of messages, and runs cooperative background [`Task`]s in
|
|
5
|
+
//! short time slices that always yield to queued foreground work.
|
|
6
|
+
//!
|
|
7
|
+
//! Two embedding modes share every line of the loop:
|
|
8
|
+
//! - **Engine-owned:** [`Runtime::start`] spawns and pins one thread per shard.
|
|
9
|
+
//! - **Application-owned:** [`Runtime::application_owned`] returns one [`ShardDriver`] per
|
|
10
|
+
//! shard; the application calls [`ShardDriver::run_once`] from its own core threads. The
|
|
11
|
+
//! simulator uses this mode to run shards deterministically.
|
|
12
|
+
//! [`Runtime::application_owned_with_workers`] also returns background workers
|
|
13
|
+
//! ([`PoolDriver`], D284) the application drives the same way, so flush and compaction
|
|
14
|
+
//! leave the shards as engine-owned mode's compaction threads take them off.
|
|
15
|
+
//!
|
|
16
|
+
//! Messages are a type the engine defines (`H::Msg`), so the hot path has no boxing and no
|
|
17
|
+
//! virtual calls. Background tasks are boxed (`Box<dyn Task>`): they are few and long-lived.
|
|
18
|
+
//!
|
|
19
|
+
//! # Shared state
|
|
20
|
+
//! Shards share nothing mutable except their documented queues: each shard's message queue
|
|
21
|
+
//! (a lock-free `std::sync::mpsc` channel plus a closed flag and in-flight counter), its
|
|
22
|
+
//! idle/wake flag, and the background workers' pool (its queue and the tasks each worker
|
|
23
|
+
//! holds, D284). A
|
|
24
|
+
//! [`Notifier`]/[`Waiter`] pair shares one completion slot between two parties.
|
|
25
|
+
//!
|
|
26
|
+
//! # Example
|
|
27
|
+
//! ```
|
|
28
|
+
//! use std::sync::Arc;
|
|
29
|
+
//! use pigeonhole_io::pread::PreadVfs;
|
|
30
|
+
//! use pigeonhole_runtime::{
|
|
31
|
+
//! Notifier, Runtime, RuntimeConfig, ShardContext, ShardHandler, ShardId, completion,
|
|
32
|
+
//! };
|
|
33
|
+
//!
|
|
34
|
+
//! /// Each shard keeps a running sum and replies with it.
|
|
35
|
+
//! struct Adder(u64);
|
|
36
|
+
//!
|
|
37
|
+
//! impl ShardHandler for Adder {
|
|
38
|
+
//! type Msg = (u64, Notifier<u64>);
|
|
39
|
+
//! fn handle(&mut self, _ctx: &mut ShardContext<'_, Self::Msg>, (n, reply): Self::Msg) {
|
|
40
|
+
//! self.0 += n;
|
|
41
|
+
//! reply.notify(self.0);
|
|
42
|
+
//! }
|
|
43
|
+
//! fn end_batch(&mut self, _ctx: &mut ShardContext<'_, Self::Msg>) {}
|
|
44
|
+
//! }
|
|
45
|
+
//!
|
|
46
|
+
//! let mut config = RuntimeConfig::new(PreadVfs::new(1));
|
|
47
|
+
//! config.shards = 2;
|
|
48
|
+
//! config.pin_threads = false;
|
|
49
|
+
//! let rt = Runtime::start(config, vec![Adder(0), Adder(100)])?;
|
|
50
|
+
//! let (tx, rx) = completion();
|
|
51
|
+
//! rt.submitter(ShardId(1)).submit((5, tx))?;
|
|
52
|
+
//! assert_eq!(rx.wait(), Some(105));
|
|
53
|
+
//! let handlers = rt.shutdown()?;
|
|
54
|
+
//! assert_eq!(handlers[1].0, 105);
|
|
55
|
+
//! # Ok::<(), pigeonhole_runtime::Error>(())
|
|
56
|
+
//! ```
|
|
57
|
+
//!
|
|
58
|
+
//! Part of [Pigeonhole](https://github.com/CodingAnarchy/pigeonhole). See the crate README.
|
|
59
|
+
#![forbid(unsafe_code)]
|
|
60
|
+
|
|
61
|
+
mod completion;
|
|
62
|
+
mod drivers;
|
|
63
|
+
mod pool;
|
|
64
|
+
mod sched;
|
|
65
|
+
mod signal;
|
|
66
|
+
mod submit_gate;
|
|
67
|
+
|
|
68
|
+
use std::cell::Cell;
|
|
69
|
+
use std::fmt;
|
|
70
|
+
use std::sync::Arc;
|
|
71
|
+
use std::sync::mpsc::{self, Receiver, Sender};
|
|
72
|
+
use std::thread::{self, JoinHandle};
|
|
73
|
+
use std::time::Duration;
|
|
74
|
+
|
|
75
|
+
use pigeonhole_io::{Vfs, VfsRef};
|
|
76
|
+
|
|
77
|
+
pub use completion::{Notifier, Settle, SlotCache, Waiter, completion, completion_from};
|
|
78
|
+
pub use pool::{PoolDriver, WorkerPool};
|
|
79
|
+
pub use sched::{Task, TaskPoll, TaskWaker};
|
|
80
|
+
|
|
81
|
+
use pool::{Origin, Pool};
|
|
82
|
+
use sched::{Scheduler, Spawner};
|
|
83
|
+
use signal::{Signal, WakeTarget};
|
|
84
|
+
|
|
85
|
+
/// Most messages handled before `end_batch` runs, so a flooded queue still commits groups.
|
|
86
|
+
const MAX_BATCH: usize = 1024;
|
|
87
|
+
|
|
88
|
+
/// The most turns in a row that skip their background slices because a future of the
|
|
89
|
+
/// driving thread was woken (D237): the next turn runs them, so flush and compaction keep
|
|
90
|
+
/// at least one turn in `MAX_TURN_YIELDS + 1`.
|
|
91
|
+
const MAX_TURN_YIELDS: u32 = 8;
|
|
92
|
+
|
|
93
|
+
/// Result alias for this crate.
|
|
94
|
+
pub type Result<T, E = Error> = std::result::Result<T, E>;
|
|
95
|
+
|
|
96
|
+
/// Runtime errors.
|
|
97
|
+
#[derive(Debug)]
|
|
98
|
+
#[non_exhaustive]
|
|
99
|
+
pub enum Error {
|
|
100
|
+
/// The shard's queue is closed (shutdown).
|
|
101
|
+
Closed,
|
|
102
|
+
/// A thread could not be spawned or pinned.
|
|
103
|
+
Spawn(std::io::Error),
|
|
104
|
+
/// The configuration is not valid for the chosen mode; names the field.
|
|
105
|
+
InvalidConfig(&'static str),
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
impl fmt::Display for Error {
|
|
109
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
110
|
+
match self {
|
|
111
|
+
Error::Closed => f.write_str("shard queue is closed"),
|
|
112
|
+
Error::Spawn(e) => write!(f, "could not start runtime thread: {e}"),
|
|
113
|
+
Error::InvalidConfig(what) => write!(f, "invalid runtime configuration: {what}"),
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
impl std::error::Error for Error {
|
|
119
|
+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
|
120
|
+
match self {
|
|
121
|
+
Error::Closed | Error::InvalidConfig(_) => None,
|
|
122
|
+
Error::Spawn(e) => Some(e),
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// A shard's index, `0..shard_count`.
|
|
128
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
|
129
|
+
pub struct ShardId(pub u16);
|
|
130
|
+
|
|
131
|
+
/// Runtime configuration.
|
|
132
|
+
///
|
|
133
|
+
/// ```
|
|
134
|
+
/// use std::time::Duration;
|
|
135
|
+
/// use pigeonhole_io::pread::PreadVfs;
|
|
136
|
+
/// use pigeonhole_runtime::RuntimeConfig;
|
|
137
|
+
///
|
|
138
|
+
/// let mut config = RuntimeConfig::new(PreadVfs::new(1));
|
|
139
|
+
/// assert!(config.shards >= 1);
|
|
140
|
+
/// config.time_slice = Duration::from_micros(200);
|
|
141
|
+
/// ```
|
|
142
|
+
#[derive(Debug, Clone)]
|
|
143
|
+
#[non_exhaustive]
|
|
144
|
+
pub struct RuntimeConfig {
|
|
145
|
+
/// Number of shards (default: one per physical core, D220).
|
|
146
|
+
pub shards: usize,
|
|
147
|
+
/// Pin shard threads to CPUs (engine-owned mode).
|
|
148
|
+
pub pin_threads: bool,
|
|
149
|
+
/// Background workers for flush and compaction; 0 runs them on the shards. Engine-owned
|
|
150
|
+
/// mode starts a pinned thread per worker. Application-owned mode starts no threads
|
|
151
|
+
/// (decision D40): [`Runtime::application_owned_with_workers`] hands the workers to the
|
|
152
|
+
/// application to drive (D284), and [`Runtime::application_owned`] refuses a nonzero
|
|
153
|
+
/// value with [`Error::InvalidConfig`]. As with tasks on shards, tasks still queued or
|
|
154
|
+
/// running on engine-owned workers at shutdown are dropped unfinished.
|
|
155
|
+
pub compaction_threads: usize,
|
|
156
|
+
/// Engine-owned mode: the driver threads the shards run on (D289). Zero (the default)
|
|
157
|
+
/// gives each shard a thread of its own; `k` in `1..shards` runs the shards' turns on
|
|
158
|
+
/// `k` threads, shard `i` on thread `i % k`, each pinned like a shard thread. A larger
|
|
159
|
+
/// value means one per shard. Fewer threads, each busier, park less: a commit then
|
|
160
|
+
/// rarely waits for its shard's thread to be woken and scheduled (#760).
|
|
161
|
+
pub shard_threads: usize,
|
|
162
|
+
/// Engine-owned mode: size the driver threads to the load (D289 PR 2). Up to
|
|
163
|
+
/// `shard_threads` drivers (one per shard if 0) start, all pinned, and the shards move
|
|
164
|
+
/// between them: a light load runs on few, which park less, a heavy one on all. Off, the
|
|
165
|
+
/// shards stay on `shard_threads` drivers as started.
|
|
166
|
+
pub adaptive_drivers: bool,
|
|
167
|
+
/// Longest a background task runs before yielding.
|
|
168
|
+
pub time_slice: Duration,
|
|
169
|
+
/// Engine-owned mode: how long a shard thread that just handled a message keeps
|
|
170
|
+
/// polling its queue before it parks (D198). A message that arrives meanwhile is
|
|
171
|
+
/// handled without the producer waking the thread. Zero (the default) parks at once.
|
|
172
|
+
/// A window that finds nothing backs off: the thread skips the next 1, 2, 4, ... up to 32
|
|
173
|
+
/// windows, and an idle shard (no message since its last park) never polls.
|
|
174
|
+
pub idle_spin: Duration,
|
|
175
|
+
/// Engine-owned mode: the longest window a driver may poll for (#1176). Above
|
|
176
|
+
/// `idle_spin`, each driver sizes its window from its recent idle gaps: the longest, up
|
|
177
|
+
/// to this cap, whose expected poll per gap costs no more than `idle_spin`'s could. A
|
|
178
|
+
/// steady stream of messages then waits for a wake about as rarely as under the cap, and
|
|
179
|
+
/// a sparse one polls no longer per message than under `idle_spin`. Zero (the default),
|
|
180
|
+
/// or at most `idle_spin`: the window is `idle_spin`, fixed.
|
|
181
|
+
pub idle_spin_cap: Duration,
|
|
182
|
+
/// Clock source (simulated under test).
|
|
183
|
+
pub vfs: VfsRef,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
impl RuntimeConfig {
|
|
187
|
+
/// Defaults: one shard per physical core (D220), pinned, no compaction threads, 500 µs
|
|
188
|
+
/// slices.
|
|
189
|
+
pub fn new(vfs: VfsRef) -> Self {
|
|
190
|
+
Self {
|
|
191
|
+
shards: pigeonhole_io::sys::default_shards(),
|
|
192
|
+
pin_threads: true,
|
|
193
|
+
compaction_threads: 0,
|
|
194
|
+
shard_threads: 0,
|
|
195
|
+
adaptive_drivers: false,
|
|
196
|
+
time_slice: Duration::from_micros(500),
|
|
197
|
+
idle_spin: Duration::ZERO,
|
|
198
|
+
idle_spin_cap: Duration::ZERO,
|
|
199
|
+
vfs,
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
fn slice_nanos(&self) -> u64 {
|
|
204
|
+
u64::try_from(self.time_slice.as_nanos())
|
|
205
|
+
.unwrap_or(u64::MAX)
|
|
206
|
+
.max(1)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/// The engine's per-shard state. One instance per shard, moved onto its thread.
|
|
211
|
+
///
|
|
212
|
+
/// See the [crate example](crate#example).
|
|
213
|
+
pub trait ShardHandler: Send + 'static {
|
|
214
|
+
/// The message type submitted to this shard.
|
|
215
|
+
type Msg: Send + 'static;
|
|
216
|
+
|
|
217
|
+
/// Handles one foreground message. `ctx` gives access to other shards and background
|
|
218
|
+
/// spawning.
|
|
219
|
+
fn handle(&mut self, ctx: &mut ShardContext<'_, Self::Msg>, msg: Self::Msg);
|
|
220
|
+
|
|
221
|
+
/// Called after each drained batch of messages (the group-commit point: write the WAL
|
|
222
|
+
/// once, sync once, publish, wake committers).
|
|
223
|
+
fn end_batch(&mut self, ctx: &mut ShardContext<'_, Self::Msg>);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/// The handler's view of the runtime while it runs on its shard.
|
|
227
|
+
///
|
|
228
|
+
/// ```
|
|
229
|
+
/// use pigeonhole_runtime::{ShardContext, ShardHandler, ShardId};
|
|
230
|
+
///
|
|
231
|
+
/// /// Forwards every message to the next shard until its hop count runs out.
|
|
232
|
+
/// struct Relay;
|
|
233
|
+
///
|
|
234
|
+
/// impl ShardHandler for Relay {
|
|
235
|
+
/// type Msg = u32;
|
|
236
|
+
/// fn handle(&mut self, ctx: &mut ShardContext<'_, u32>, hops: u32) {
|
|
237
|
+
/// if hops > 0 {
|
|
238
|
+
/// let next = ShardId(((ctx.shard().0 as usize + 1) % ctx.shard_count()) as u16);
|
|
239
|
+
/// let _ = ctx.submitter(next).submit(hops - 1);
|
|
240
|
+
/// }
|
|
241
|
+
/// }
|
|
242
|
+
/// fn end_batch(&mut self, _ctx: &mut ShardContext<'_, u32>) {}
|
|
243
|
+
/// }
|
|
244
|
+
/// ```
|
|
245
|
+
pub struct ShardContext<'a, M> {
|
|
246
|
+
shard: ShardId,
|
|
247
|
+
submitters: &'a [Submitter<M>],
|
|
248
|
+
spawner: &'a mut Spawner,
|
|
249
|
+
vfs: &'a dyn Vfs,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
impl<M> fmt::Debug for ShardContext<'_, M> {
|
|
253
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
254
|
+
f.debug_struct("ShardContext")
|
|
255
|
+
.field("shard", &self.shard)
|
|
256
|
+
.field("shard_count", &self.submitters.len())
|
|
257
|
+
.finish_non_exhaustive()
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
impl<M: Send + 'static> ShardContext<'_, M> {
|
|
262
|
+
/// This shard.
|
|
263
|
+
pub fn shard(&self) -> ShardId {
|
|
264
|
+
self.shard
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/// Number of shards.
|
|
268
|
+
pub fn shard_count(&self) -> usize {
|
|
269
|
+
self.submitters.len()
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// Submitter for another shard.
|
|
273
|
+
///
|
|
274
|
+
/// # Panics
|
|
275
|
+
/// If `shard` is out of range.
|
|
276
|
+
pub fn submitter(&self, shard: ShardId) -> &Submitter<M> {
|
|
277
|
+
&self.submitters[usize::from(shard.0)]
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/// Schedules a background task on this shard, or on the background workers if
|
|
281
|
+
/// configured (unless it does not [`offload`](Task::offload)).
|
|
282
|
+
pub fn spawn(&mut self, task: Box<dyn Task>) {
|
|
283
|
+
self.spawner.spawn(task);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/// Runs [`Task::reclaim`] on the tasks the background workers have handed back to this
|
|
287
|
+
/// shard and takes them in, now rather than at the start of the next turn (D284). A
|
|
288
|
+
/// closing engine calls it on its close message: the workers' close handed them back
|
|
289
|
+
/// before that message was sent, so everything the close took back is here.
|
|
290
|
+
pub fn take_back(&mut self) {
|
|
291
|
+
let now = self.vfs.monotonic_nanos();
|
|
292
|
+
self.spawner.take_back(now);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/// For a room wait on this shard (writers waiting for a flush to free memtable room,
|
|
296
|
+
/// D284): takes back this shard's commit-path tasks ([`Task::commit_path`]: flushes, the manifest pump, WAL spares) that an
|
|
297
|
+
/// application's background worker holds but has not run for 2 ms, to run here. Never
|
|
298
|
+
/// waits: a flush a worker is running stays there. Looks again by itself while one is
|
|
299
|
+
/// not yet that idle. Returns how many came back now; 0 without workers, and always on
|
|
300
|
+
/// engine-owned workers, which are always driven.
|
|
301
|
+
pub fn reclaim_room(&mut self) -> usize {
|
|
302
|
+
let now = self.vfs.monotonic_nanos();
|
|
303
|
+
self.spawner.reclaim_room(now)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// Monotonic time in nanoseconds.
|
|
307
|
+
pub fn now_nanos(&self) -> u64 {
|
|
308
|
+
self.vfs.monotonic_nanos()
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/// One shard's queue. Producers share it through [`Submitter`]s.
|
|
313
|
+
struct Inbox<M> {
|
|
314
|
+
shard: ShardId,
|
|
315
|
+
tx: Sender<M>,
|
|
316
|
+
/// Submits against shutdown (`submit_gate`).
|
|
317
|
+
gate: submit_gate::SubmitGate,
|
|
318
|
+
signal: Arc<Signal>,
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
impl<M> Inbox<M> {
|
|
322
|
+
fn close(&self) {
|
|
323
|
+
self.gate.close();
|
|
324
|
+
self.signal.force_wake();
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
fn is_closed(&self) -> bool {
|
|
328
|
+
self.gate.is_closed()
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/// Sends messages to one shard's lock-free MPSC queue and wakes it. Cheap to clone.
|
|
333
|
+
///
|
|
334
|
+
/// Messages from one submitter (or one thread) arrive in the order they were submitted.
|
|
335
|
+
/// See the [crate example](crate#example).
|
|
336
|
+
pub struct Submitter<M> {
|
|
337
|
+
inbox: Arc<Inbox<M>>,
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
impl<M> fmt::Debug for Submitter<M> {
|
|
341
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
342
|
+
f.debug_struct("Submitter")
|
|
343
|
+
.field("shard", &self.inbox.shard)
|
|
344
|
+
.finish_non_exhaustive()
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
impl<M> Clone for Submitter<M> {
|
|
349
|
+
fn clone(&self) -> Self {
|
|
350
|
+
Self {
|
|
351
|
+
inbox: Arc::clone(&self.inbox),
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
impl<M: Send + 'static> Submitter<M> {
|
|
357
|
+
/// `(parks, wakes)` of the target shard since the runtime started (ICR 0027): times its
|
|
358
|
+
/// engine-owned thread parked with nothing to do (after its idle spin), and submits or
|
|
359
|
+
/// notifications that found it announced asleep and woke it. An application-owned
|
|
360
|
+
/// shard's loop sleeps in the application, so only its wakes are counted. Relaxed: a
|
|
361
|
+
/// reading taken while the shard runs may lag it.
|
|
362
|
+
pub fn idle_counts(&self) -> (u64, u64) {
|
|
363
|
+
self.inbox.signal.idle_counts()
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/// Nanoseconds the target shard's engine-owned thread has spent in its work turns since
|
|
367
|
+
/// the runtime started (D217, ICR 0033): handling messages and running its tasks, not
|
|
368
|
+
/// spinning (D198) or parked. Its rise over an interval, divided by the interval, is how
|
|
369
|
+
/// busy the shard was. An application-owned shard's loop is the application's, so
|
|
370
|
+
/// nothing is counted. Relaxed: a reading taken during a turn lags it.
|
|
371
|
+
pub fn busy_nanos(&self) -> u64 {
|
|
372
|
+
self.inbox.signal.busy_nanos()
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/// Nanoseconds the compaction pool's threads have spent in slices of the tasks the
|
|
376
|
+
/// target shard spawned onto the pool (its flushes and compactions, D256), since the
|
|
377
|
+
/// runtime started. With `compaction_threads = 0` the shard runs those slices inside
|
|
378
|
+
/// its own turns and nothing is counted here. Relaxed, as [`Submitter::busy_nanos`].
|
|
379
|
+
pub fn pool_busy_nanos(&self) -> u64 {
|
|
380
|
+
self.inbox.signal.pool_busy_nanos()
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/// Nanoseconds the target shard's engine-owned thread has spent in its spin before
|
|
384
|
+
/// parking (D198: polling for the next message after handling one), since the runtime
|
|
385
|
+
/// started (D256). Not part of [`Submitter::busy_nanos`]; the balancer adds the two.
|
|
386
|
+
/// Relaxed, as that one.
|
|
387
|
+
pub fn spin_nanos(&self) -> u64 {
|
|
388
|
+
self.inbox.signal.spin_nanos()
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/// `(fallbacks, room)`: tasks of the target shard's that came back from the background
|
|
392
|
+
/// workers (D284) because no worker made a pass for 10 ms while they were queued
|
|
393
|
+
/// (workers configured but not driven), and commit-path tasks a room wait on the shard
|
|
394
|
+
/// took back from a worker that held them without running them. Relaxed.
|
|
395
|
+
pub fn background_take_backs(&self) -> (u64, u64) {
|
|
396
|
+
self.inbox.signal.take_back_counts()
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/// Enqueues `msg`. Fails only after shutdown.
|
|
400
|
+
pub fn submit(&self, msg: M) -> Result<()> {
|
|
401
|
+
let inbox = &*self.inbox;
|
|
402
|
+
// Either shutdown sees us enter and waits for the send, or we see it closed and
|
|
403
|
+
// refuse (`submit_gate`).
|
|
404
|
+
if !inbox.gate.enter() {
|
|
405
|
+
return Err(Error::Closed);
|
|
406
|
+
}
|
|
407
|
+
let sent = inbox.tx.send(msg);
|
|
408
|
+
inbox.gate.leave();
|
|
409
|
+
sent.map_err(|_| Error::Closed)?;
|
|
410
|
+
inbox.signal.notify();
|
|
411
|
+
Ok(())
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
thread_local! {
|
|
416
|
+
static CURRENT_SHARD: Cell<Option<ShardId>> = const { Cell::new(None) };
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/// Marks the calling thread as running `shard` until dropped.
|
|
420
|
+
struct EnterShard(Option<ShardId>);
|
|
421
|
+
|
|
422
|
+
impl EnterShard {
|
|
423
|
+
fn new(shard: ShardId) -> Self {
|
|
424
|
+
Self(CURRENT_SHARD.with(|c| c.replace(Some(shard))))
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
impl Drop for EnterShard {
|
|
429
|
+
fn drop(&mut self) {
|
|
430
|
+
CURRENT_SHARD.with(|c| c.set(self.0));
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/// A small id for the calling thread, nonzero: cheaper to compare each turn than
|
|
435
|
+
/// `thread::current().id()`, which counts a reference.
|
|
436
|
+
fn thread_token() -> u64 {
|
|
437
|
+
thread_local! {
|
|
438
|
+
static TOKEN: std::cell::Cell<u64> = const { std::cell::Cell::new(0) };
|
|
439
|
+
}
|
|
440
|
+
static NEXT: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(1);
|
|
441
|
+
TOKEN.with(|t| match t.get() {
|
|
442
|
+
0 => {
|
|
443
|
+
let v = NEXT.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
|
444
|
+
t.set(v);
|
|
445
|
+
v
|
|
446
|
+
}
|
|
447
|
+
v => v,
|
|
448
|
+
})
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/// The shard loop, shared by both embedding modes.
|
|
452
|
+
struct ShardCore<H: ShardHandler> {
|
|
453
|
+
id: ShardId,
|
|
454
|
+
handler: H,
|
|
455
|
+
rx: Receiver<H::Msg>,
|
|
456
|
+
/// A message taken while checking for work before sleeping; handled first.
|
|
457
|
+
stash: Option<H::Msg>,
|
|
458
|
+
submitters: Arc<[Submitter<H::Msg>]>,
|
|
459
|
+
spawner: Spawner,
|
|
460
|
+
vfs: VfsRef,
|
|
461
|
+
time_slice: u64,
|
|
462
|
+
/// The clock when the loop last went idle with sleeping tasks: if it reads the same at
|
|
463
|
+
/// the next pass, the clock is not moving on its own and sleepers run early to notice.
|
|
464
|
+
idle_at: Option<u64>,
|
|
465
|
+
/// The thread ([`thread_token`]) last given its own I/O ring (`Vfs::attach_thread`, at
|
|
466
|
+
/// its first turn of this shard; 0: none yet), and whether it got one: a turn reaps only
|
|
467
|
+
/// then, so a backend without rings costs a turn nothing (#402). Per thread, not once: an
|
|
468
|
+
/// application may move a shard to another thread, which needs a ring of its own, or its
|
|
469
|
+
/// I/O would go to a ring no thread reaps (the #473 scaling hang).
|
|
470
|
+
attached: u64,
|
|
471
|
+
own_ring: bool,
|
|
472
|
+
/// Debug builds: whether the thread's ring still had I/O in flight when its last turn of
|
|
473
|
+
/// this shard ended, and whether `release` ran since. A shard that turns up on another
|
|
474
|
+
/// thread with I/O left behind unreleased is a bug (#492).
|
|
475
|
+
#[cfg(debug_assertions)]
|
|
476
|
+
left_io: bool,
|
|
477
|
+
#[cfg(debug_assertions)]
|
|
478
|
+
released: bool,
|
|
479
|
+
/// Polling the queue before parking (D198; engine-owned mode only).
|
|
480
|
+
spin: IdleSpin,
|
|
481
|
+
/// Messages handled and background slices run, in all (`ShardDriver::work_count`).
|
|
482
|
+
work_done: u64,
|
|
483
|
+
/// Turns in a row that ended before their background slices because a future of the
|
|
484
|
+
/// driving thread was woken (D237; application-owned mode only, at most
|
|
485
|
+
/// [`MAX_TURN_YIELDS`]).
|
|
486
|
+
yields: u32,
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/// An engine-owned shard's poll of its queue before it parks (D198).
|
|
490
|
+
#[derive(Debug)]
|
|
491
|
+
struct IdleSpin {
|
|
492
|
+
window: Duration,
|
|
493
|
+
/// The adaptive window's cap (`RuntimeConfig::idle_spin_cap`); at most `window`: fixed.
|
|
494
|
+
cap: Duration,
|
|
495
|
+
/// A message was handled since the thread last parked or polled.
|
|
496
|
+
worked: bool,
|
|
497
|
+
/// Polls still to skip after one found nothing, and the backoff exponent.
|
|
498
|
+
skip: u32,
|
|
499
|
+
level: u32,
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
impl IdleSpin {
|
|
503
|
+
/// The most polls skipped after polls kept finding nothing.
|
|
504
|
+
const MAX_SKIP: u32 = 64;
|
|
505
|
+
|
|
506
|
+
fn new(window: Duration, cap: Duration) -> Self {
|
|
507
|
+
Self {
|
|
508
|
+
window,
|
|
509
|
+
cap,
|
|
510
|
+
worked: false,
|
|
511
|
+
skip: 0,
|
|
512
|
+
level: 0,
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/// Whether to poll before parking now; consumes the "handled a message" mark.
|
|
517
|
+
fn due(&mut self) -> bool {
|
|
518
|
+
if self.window.is_zero() || !std::mem::take(&mut self.worked) {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
if self.skip > 0 {
|
|
522
|
+
self.skip -= 1;
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
true
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/// Records a poll's outcome: a hit resets the backoff, a miss doubles it.
|
|
529
|
+
fn record(&mut self, hit: bool) {
|
|
530
|
+
if hit {
|
|
531
|
+
self.level = 0;
|
|
532
|
+
} else {
|
|
533
|
+
self.level = (self.level + 1).min(Self::MAX_SKIP.trailing_zeros());
|
|
534
|
+
self.skip = 1 << (self.level - 1);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
impl<H: ShardHandler> ShardCore<H> {
|
|
540
|
+
fn inbox(&self) -> &Inbox<H::Msg> {
|
|
541
|
+
&self.submitters[usize::from(self.id.0)].inbox
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
fn signal(&self) -> &Signal {
|
|
545
|
+
&self.inbox().signal
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/// Splits `self` into the handler and its context.
|
|
549
|
+
fn parts(&mut self) -> (&mut H, ShardContext<'_, H::Msg>) {
|
|
550
|
+
let ctx = ShardContext {
|
|
551
|
+
shard: self.id,
|
|
552
|
+
submitters: &self.submitters,
|
|
553
|
+
spawner: &mut self.spawner,
|
|
554
|
+
vfs: &*self.vfs,
|
|
555
|
+
};
|
|
556
|
+
(&mut self.handler, ctx)
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/// Handles up to [`MAX_BATCH`] queued messages, then calls `end_batch` if any ran.
|
|
560
|
+
fn drain(&mut self) -> usize {
|
|
561
|
+
let stash = self.stash.take();
|
|
562
|
+
let ShardCore {
|
|
563
|
+
id,
|
|
564
|
+
handler,
|
|
565
|
+
rx,
|
|
566
|
+
submitters,
|
|
567
|
+
spawner,
|
|
568
|
+
vfs,
|
|
569
|
+
..
|
|
570
|
+
} = self;
|
|
571
|
+
let mut ctx = ShardContext {
|
|
572
|
+
shard: *id,
|
|
573
|
+
submitters,
|
|
574
|
+
spawner,
|
|
575
|
+
vfs: &**vfs,
|
|
576
|
+
};
|
|
577
|
+
let mut n = 0;
|
|
578
|
+
if let Some(msg) = stash {
|
|
579
|
+
handler.handle(&mut ctx, msg);
|
|
580
|
+
n += 1;
|
|
581
|
+
}
|
|
582
|
+
while n < MAX_BATCH {
|
|
583
|
+
match rx.try_recv() {
|
|
584
|
+
Ok(msg) => {
|
|
585
|
+
handler.handle(&mut ctx, msg);
|
|
586
|
+
n += 1;
|
|
587
|
+
}
|
|
588
|
+
Err(_) => break,
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
if n > 0 {
|
|
592
|
+
handler.end_batch(&mut ctx);
|
|
593
|
+
self.spin.worked = true;
|
|
594
|
+
self.work_done += n as u64;
|
|
595
|
+
}
|
|
596
|
+
n
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
fn run_once(&mut self, deadline: u64) -> bool {
|
|
600
|
+
let more = self.run_turn(deadline);
|
|
601
|
+
#[cfg(debug_assertions)]
|
|
602
|
+
{
|
|
603
|
+
self.left_io = self.own_ring && pigeonhole_io::own_io_in_flight();
|
|
604
|
+
}
|
|
605
|
+
more
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/// Hands the shard over cleanly: drives it until the calling thread's ring has nothing
|
|
609
|
+
/// in flight, so nothing of the shard's waits on a ring only this thread may reap (#492,
|
|
610
|
+
/// ICR 0029). Without per-thread rings it returns at once.
|
|
611
|
+
fn release(&mut self) {
|
|
612
|
+
if !self.own_ring || self.attached != thread_token() {
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
let slice = std::time::Duration::from_millis(1);
|
|
616
|
+
while pigeonhole_io::own_io_in_flight() {
|
|
617
|
+
pigeonhole_io::reap_own_io(Some(slice));
|
|
618
|
+
let deadline = self.vfs.monotonic_nanos().saturating_add(1_000_000);
|
|
619
|
+
self.run_turn(deadline);
|
|
620
|
+
}
|
|
621
|
+
#[cfg(debug_assertions)]
|
|
622
|
+
{
|
|
623
|
+
self.left_io = false;
|
|
624
|
+
self.released = true;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/// An engine-owned driver hands the shard to another with its own ring quiet (D289 PR
|
|
629
|
+
/// 2): nothing of the thread's is in flight, as after `release`.
|
|
630
|
+
fn mark_released(&mut self) {
|
|
631
|
+
#[cfg(debug_assertions)]
|
|
632
|
+
{
|
|
633
|
+
self.left_io = false;
|
|
634
|
+
self.released = true;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
fn run_turn(&mut self, deadline: u64) -> bool {
|
|
639
|
+
let _shard = EnterShard::new(self.id);
|
|
640
|
+
self.signal().awake();
|
|
641
|
+
// A backend with a ring per driving thread (#402) gives each thread that runs this
|
|
642
|
+
// shard its own (a shard moved to another thread needs one there, #473); what
|
|
643
|
+
// completed on it resolves now, so the work it unblocks runs this turn. Without rings
|
|
644
|
+
// nothing depends on the thread: a turn pays the two branches it always did, and only
|
|
645
|
+
// a ring backend reads the thread token (#485's instruction ceilings).
|
|
646
|
+
if self.own_ring {
|
|
647
|
+
if self.attached != thread_token() {
|
|
648
|
+
#[cfg(debug_assertions)]
|
|
649
|
+
{
|
|
650
|
+
assert!(
|
|
651
|
+
!self.left_io || self.released,
|
|
652
|
+
"shard {} moved to another thread while its I/O was in flight on the \
|
|
653
|
+
old thread's ring: call release() on the old thread first (#492)",
|
|
654
|
+
self.id.0
|
|
655
|
+
);
|
|
656
|
+
self.released = false;
|
|
657
|
+
}
|
|
658
|
+
self.attach();
|
|
659
|
+
}
|
|
660
|
+
pigeonhole_io::reap_own_io(None);
|
|
661
|
+
} else if self.attached == 0 {
|
|
662
|
+
self.attach();
|
|
663
|
+
}
|
|
664
|
+
// Tasks back from the background workers first (D284): what they report on the
|
|
665
|
+
// way back is queued before anything this turn handles that a later reclaim (the
|
|
666
|
+
// engine's close) sent after them.
|
|
667
|
+
let start = self.vfs.monotonic_nanos();
|
|
668
|
+
if self.spawner.has_pool() {
|
|
669
|
+
self.spawner.take_back(start);
|
|
670
|
+
}
|
|
671
|
+
self.drain();
|
|
672
|
+
self.spawner.local.collect_woken();
|
|
673
|
+
if self.idle_at.take() == Some(start) && self.vfs.clock_is_simulated() {
|
|
674
|
+
// A simulated clock has not moved since the loop went idle: sleepers check for
|
|
675
|
+
// themselves (a real clock that reads the same only ticks coarsely, #263).
|
|
676
|
+
self.spawner.local.wake_sleepers();
|
|
677
|
+
}
|
|
678
|
+
self.spawner.local.wake_due(start);
|
|
679
|
+
if self.spawner.local.has_runnable() {
|
|
680
|
+
// D237: the drain woke a future the driving thread awaits (a commit it submitted
|
|
681
|
+
// settled): hand the thread back before the background slices, so it sees that
|
|
682
|
+
// now rather than at the deadline. The slices run next turn, and after
|
|
683
|
+
// `MAX_TURN_YIELDS` such turns in a row one runs them anyway. Only a
|
|
684
|
+
// `ShardDriver::waker` wakes this, so engine-owned threads never skip. Checked
|
|
685
|
+
// only when there are slices to skip: a turn without background work pays
|
|
686
|
+
// nothing (the D193 commit ceilings), and a wake left for a later turn costs
|
|
687
|
+
// that turn's slices at most.
|
|
688
|
+
if self.signal().take_turn_woken() && self.yields < MAX_TURN_YIELDS {
|
|
689
|
+
self.yields += 1;
|
|
690
|
+
return true;
|
|
691
|
+
}
|
|
692
|
+
self.yields = 0;
|
|
693
|
+
loop {
|
|
694
|
+
let now = self.vfs.monotonic_nanos();
|
|
695
|
+
if now >= deadline {
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
self.spawner
|
|
699
|
+
.local
|
|
700
|
+
.run_one(now.saturating_add(self.time_slice).min(deadline));
|
|
701
|
+
self.work_done += 1;
|
|
702
|
+
// Foreground first: whatever queued during the slice runs before the next
|
|
703
|
+
// one.
|
|
704
|
+
self.drain();
|
|
705
|
+
self.spawner.local.collect_woken();
|
|
706
|
+
self.spawner.local.wake_due(self.vfs.monotonic_nanos());
|
|
707
|
+
if !self.spawner.local.has_runnable() {
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
if self.spawner.local.has_runnable() {
|
|
713
|
+
return true;
|
|
714
|
+
}
|
|
715
|
+
let more = self.check_before_sleep();
|
|
716
|
+
if !more && self.next_deadline().is_some() {
|
|
717
|
+
self.idle_at = Some(self.vfs.monotonic_nanos());
|
|
718
|
+
}
|
|
719
|
+
more
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/// Gives the calling thread its own I/O ring if the backend has them, once per thread.
|
|
723
|
+
#[cold]
|
|
724
|
+
fn attach(&mut self) {
|
|
725
|
+
self.attached = thread_token();
|
|
726
|
+
self.vfs.attach_thread();
|
|
727
|
+
self.own_ring = pigeonhole_io::own_io_waker().is_some();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/// The earliest deadline of a sleeping background task on this shard, or of its next
|
|
731
|
+
/// look at the background workers (D284).
|
|
732
|
+
fn next_deadline(&self) -> Option<u64> {
|
|
733
|
+
self.spawner.next_deadline()
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/// Announces sleep, then re-checks for work. Returns whether work remains.
|
|
737
|
+
fn check_before_sleep(&mut self) -> bool {
|
|
738
|
+
self.signal().prepare_sleep();
|
|
739
|
+
if self.stash.is_none() {
|
|
740
|
+
self.stash = self.rx.try_recv().ok();
|
|
741
|
+
}
|
|
742
|
+
if self.stash.is_some() || self.signal().task_woken() || self.spawner.has_back() {
|
|
743
|
+
self.signal().awake();
|
|
744
|
+
return true;
|
|
745
|
+
}
|
|
746
|
+
false
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/// An application thread's wait between turns (`ShardDriver::wait`, #553): until work
|
|
750
|
+
/// arrives, a woken task, this thread's own I/O completing, the next background
|
|
751
|
+
/// deadline, or `timeout`. It waits in the thread's ring while its own I/O is in flight
|
|
752
|
+
/// (only a reap completes that), and parks otherwise.
|
|
753
|
+
fn wait(&mut self, timeout: Duration) {
|
|
754
|
+
let now = self.vfs.monotonic_nanos();
|
|
755
|
+
let wait = self.next_deadline().map_or(timeout, |d| {
|
|
756
|
+
Duration::from_nanos(d.saturating_sub(now)).min(timeout)
|
|
757
|
+
});
|
|
758
|
+
if wait.is_zero() {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
let ring = self.own_ring && pigeonhole_io::own_io_in_flight();
|
|
762
|
+
let signal = &self.submitters[usize::from(self.id.0)].inbox.signal;
|
|
763
|
+
let (stash, rx, spawner) = (&mut self.stash, &self.rx, &self.spawner);
|
|
764
|
+
signal.sleep_unless(
|
|
765
|
+
|| {
|
|
766
|
+
if stash.is_none() {
|
|
767
|
+
*stash = rx.try_recv().ok();
|
|
768
|
+
}
|
|
769
|
+
stash.is_some() || spawner.has_back()
|
|
770
|
+
},
|
|
771
|
+
|| {
|
|
772
|
+
if ring {
|
|
773
|
+
pigeonhole_io::reap_own_io(Some(wait));
|
|
774
|
+
} else {
|
|
775
|
+
debug_assert!(
|
|
776
|
+
!pigeonhole_io::in_async_poll(),
|
|
777
|
+
"a shard wait parks inside an async poll (a lost wake, #1226)"
|
|
778
|
+
);
|
|
779
|
+
thread::park_timeout(wait);
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/// Shutdown: wait out in-flight submits, then handle everything queued.
|
|
786
|
+
fn finish(&mut self) {
|
|
787
|
+
self.inbox().gate.wait_drained();
|
|
788
|
+
while self.drain() > 0 {}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/// Longest an idle shard thread waits on its own I/O ring before it looks again (a wake or a
|
|
793
|
+
/// completion ends the wait sooner).
|
|
794
|
+
const RING_IDLE_WAIT: std::time::Duration = std::time::Duration::from_millis(100);
|
|
795
|
+
|
|
796
|
+
/// Every shard's submitter, indexed by shard.
|
|
797
|
+
type Submitters<M> = Arc<[Submitter<M>]>;
|
|
798
|
+
|
|
799
|
+
/// Builds every shard's queue and loop state.
|
|
800
|
+
fn build<H: ShardHandler>(
|
|
801
|
+
config: &RuntimeConfig,
|
|
802
|
+
handlers: Vec<H>,
|
|
803
|
+
pool: Option<&Arc<Pool>>,
|
|
804
|
+
) -> (Submitters<H::Msg>, Vec<ShardCore<H>>) {
|
|
805
|
+
let n = handlers.len();
|
|
806
|
+
assert_eq!(n, config.shards, "handlers.len() must equal config.shards");
|
|
807
|
+
assert!(
|
|
808
|
+
(1..=1 << 16).contains(&n),
|
|
809
|
+
"shard count must be in 1..=65536"
|
|
810
|
+
);
|
|
811
|
+
let mut rxs = Vec::with_capacity(n);
|
|
812
|
+
let submitters: Arc<[Submitter<H::Msg>]> = (0..n)
|
|
813
|
+
.map(|i| {
|
|
814
|
+
let (tx, rx) = mpsc::channel();
|
|
815
|
+
rxs.push(rx);
|
|
816
|
+
Submitter {
|
|
817
|
+
inbox: Arc::new(Inbox {
|
|
818
|
+
shard: ShardId(i as u16),
|
|
819
|
+
tx,
|
|
820
|
+
gate: submit_gate::SubmitGate::new(),
|
|
821
|
+
signal: Arc::new(Signal::new()),
|
|
822
|
+
}),
|
|
823
|
+
}
|
|
824
|
+
})
|
|
825
|
+
.collect();
|
|
826
|
+
let cores = handlers
|
|
827
|
+
.into_iter()
|
|
828
|
+
.zip(rxs)
|
|
829
|
+
.enumerate()
|
|
830
|
+
.map(|(i, (handler, rx))| ShardCore {
|
|
831
|
+
id: ShardId(i as u16),
|
|
832
|
+
handler,
|
|
833
|
+
rx,
|
|
834
|
+
stash: None,
|
|
835
|
+
spawner: Spawner::new(
|
|
836
|
+
Scheduler::new(Arc::clone(&submitters[i].inbox.signal)),
|
|
837
|
+
pool.cloned(),
|
|
838
|
+
Origin::new(Arc::clone(&submitters[i].inbox.signal)),
|
|
839
|
+
),
|
|
840
|
+
submitters: Arc::clone(&submitters),
|
|
841
|
+
vfs: Arc::clone(&config.vfs),
|
|
842
|
+
time_slice: config.slice_nanos(),
|
|
843
|
+
idle_at: None,
|
|
844
|
+
work_done: 0,
|
|
845
|
+
yields: 0,
|
|
846
|
+
attached: 0,
|
|
847
|
+
#[cfg(debug_assertions)]
|
|
848
|
+
left_io: false,
|
|
849
|
+
#[cfg(debug_assertions)]
|
|
850
|
+
released: false,
|
|
851
|
+
own_ring: false,
|
|
852
|
+
spin: IdleSpin::new(config.idle_spin, config.idle_spin_cap),
|
|
853
|
+
})
|
|
854
|
+
.collect();
|
|
855
|
+
(submitters, cores)
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/// How a runtime's threads were pinned (D235): see [`Runtime::pinning`].
|
|
859
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
860
|
+
#[non_exhaustive]
|
|
861
|
+
pub struct Pinning {
|
|
862
|
+
/// Threads the runtime started: shards and compaction threads.
|
|
863
|
+
pub threads: usize,
|
|
864
|
+
/// Threads pinned to a CPU of their own.
|
|
865
|
+
pub pinned: usize,
|
|
866
|
+
/// Why threads the runtime asked to pin were planned no CPU: it pinned none, or, with
|
|
867
|
+
/// too few free CPUs for every thread, only the shards (D252).
|
|
868
|
+
pub unpinned: Option<pigeonhole_io::sys::Unpinned>,
|
|
869
|
+
/// Threads the OS refused to pin; they run unpinned.
|
|
870
|
+
pub failed: usize,
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/// Spawns a named thread that pins itself to CPU id `cpu` if given, reports whether it is
|
|
874
|
+
/// pinned (a refused pin leaves it unpinned, never stops it), then runs `f`.
|
|
875
|
+
fn spawn_pinned<T: Send + 'static>(
|
|
876
|
+
name: String,
|
|
877
|
+
cpu: Option<usize>,
|
|
878
|
+
f: impl FnOnce() -> T + Send + 'static,
|
|
879
|
+
) -> Result<(JoinHandle<T>, Receiver<bool>)> {
|
|
880
|
+
let (ack_tx, ack_rx) = mpsc::channel();
|
|
881
|
+
let handle = thread::Builder::new()
|
|
882
|
+
.name(name)
|
|
883
|
+
.spawn(move || {
|
|
884
|
+
let pinned = cpu.is_some_and(|c| pigeonhole_io::sys::pin_current_thread_to(c).is_ok());
|
|
885
|
+
let _ = ack_tx.send(pinned);
|
|
886
|
+
f()
|
|
887
|
+
})
|
|
888
|
+
.map_err(Error::Spawn)?;
|
|
889
|
+
Ok((handle, ack_rx))
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
/// Engine-owned mode: the runtime's own pinned shard threads.
|
|
893
|
+
///
|
|
894
|
+
/// See the [crate example](crate#example). Dropping a `Runtime` shuts it down like
|
|
895
|
+
/// [`Runtime::shutdown`], discarding the handlers.
|
|
896
|
+
pub struct Runtime<H: ShardHandler> {
|
|
897
|
+
submitters: Arc<[Submitter<H::Msg>]>,
|
|
898
|
+
/// The driver threads, each returning the handlers of the shards it held (D289).
|
|
899
|
+
shards: Vec<JoinHandle<Vec<(ShardId, H)>>>,
|
|
900
|
+
/// Their shared state: the target, handoffs and the controller's counters.
|
|
901
|
+
drivers: Arc<drivers::Drivers<H>>,
|
|
902
|
+
/// The background workers' pool and their threads (engine-owned, D252, D284).
|
|
903
|
+
pool: Option<Arc<Pool>>,
|
|
904
|
+
workers: Vec<JoinHandle<()>>,
|
|
905
|
+
/// The CPUs this runtime's threads hold, released once they are joined (D235).
|
|
906
|
+
plan: Option<pigeonhole_io::sys::PinPlan>,
|
|
907
|
+
pinning: Pinning,
|
|
908
|
+
/// The CPUs the driver threads pinned themselves to, in driver order (ICR 0101).
|
|
909
|
+
driver_cpus: Vec<usize>,
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
impl<H: ShardHandler> fmt::Debug for Runtime<H> {
|
|
913
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
914
|
+
f.debug_struct("Runtime")
|
|
915
|
+
.field("shards", &self.submitters.len())
|
|
916
|
+
.field("compaction_threads", &self.workers.len())
|
|
917
|
+
.finish_non_exhaustive()
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
impl<H: ShardHandler> Runtime<H> {
|
|
922
|
+
/// Spawns one thread per handler (`handlers.len()` must equal `config.shards`).
|
|
923
|
+
///
|
|
924
|
+
/// With `config.pin_threads`, each shard and compaction thread gets a CPU of its own from
|
|
925
|
+
/// the opening thread's affinity set, one per physical core first and then their SMT
|
|
926
|
+
/// siblings (D220, D235), skipping CPUs other runtimes in this process hold
|
|
927
|
+
/// ([`pigeonhole_io::sys::pin_plan`]). Where that plan refuses (no hard affinity on the
|
|
928
|
+
/// platform, a CPU quota narrower than the affinity set, too few free CPUs) or the OS
|
|
929
|
+
/// refuses a pin, threads run unpinned: pinning never fails the start. With too few free
|
|
930
|
+
/// CPUs for the compaction threads but enough for the shards, only the compaction
|
|
931
|
+
/// threads run unpinned (D252).
|
|
932
|
+
/// [`pinning`](Runtime::pinning) says what happened.
|
|
933
|
+
///
|
|
934
|
+
/// # Panics
|
|
935
|
+
/// If `handlers.len() != config.shards` or the count is not in `1..=65536`.
|
|
936
|
+
pub fn start(config: RuntimeConfig, handlers: Vec<H>) -> Result<Self> {
|
|
937
|
+
let slice = config.slice_nanos();
|
|
938
|
+
let mut acks = Vec::new();
|
|
939
|
+
let (pool, drivers) = if config.compaction_threads > 0 {
|
|
940
|
+
let (pool, drivers) = Pool::new(
|
|
941
|
+
config.compaction_threads,
|
|
942
|
+
true,
|
|
943
|
+
Arc::clone(&config.vfs),
|
|
944
|
+
slice,
|
|
945
|
+
);
|
|
946
|
+
(Some(pool), drivers)
|
|
947
|
+
} else {
|
|
948
|
+
(None, Vec::new())
|
|
949
|
+
};
|
|
950
|
+
let (submitters, cores) = build(&config, handlers, pool.as_ref());
|
|
951
|
+
// The drivers started: the fixed count, or the controller's ceiling (it starts there,
|
|
952
|
+
// so a heavy load never starts short of threads, and shrinks a light one).
|
|
953
|
+
let k = match config.shard_threads {
|
|
954
|
+
0 => config.shards,
|
|
955
|
+
k => k.min(config.shards),
|
|
956
|
+
};
|
|
957
|
+
let shared = Arc::new(drivers::Drivers::new(
|
|
958
|
+
k,
|
|
959
|
+
config.adaptive_drivers,
|
|
960
|
+
Arc::clone(&config.vfs),
|
|
961
|
+
Arc::clone(&submitters),
|
|
962
|
+
));
|
|
963
|
+
let threads = k + config.compaction_threads;
|
|
964
|
+
let (plan, unpinned) = if config.pin_threads {
|
|
965
|
+
match pigeonhole_io::sys::pin_plan(threads) {
|
|
966
|
+
Ok(plan) => (Some(plan), None),
|
|
967
|
+
// Too few CPUs for the compaction threads too: pin the shard threads, which
|
|
968
|
+
// carry the commits, and leave the compaction threads unpinned (D252).
|
|
969
|
+
Err(why @ pigeonhole_io::sys::Unpinned::TooFewCpus)
|
|
970
|
+
if config.compaction_threads > 0 =>
|
|
971
|
+
{
|
|
972
|
+
(pigeonhole_io::sys::pin_plan(k).ok(), Some(why))
|
|
973
|
+
}
|
|
974
|
+
Err(why) => (None, Some(why)),
|
|
975
|
+
}
|
|
976
|
+
} else {
|
|
977
|
+
(None, None)
|
|
978
|
+
};
|
|
979
|
+
let cpu = |k: usize| plan.as_ref().and_then(|p| p.cpu(k));
|
|
980
|
+
let mut rt = Runtime {
|
|
981
|
+
submitters,
|
|
982
|
+
shards: Vec::with_capacity(k),
|
|
983
|
+
drivers: Arc::clone(&shared),
|
|
984
|
+
pool,
|
|
985
|
+
workers: Vec::new(),
|
|
986
|
+
plan: None,
|
|
987
|
+
driver_cpus: Vec::new(),
|
|
988
|
+
pinning: Pinning {
|
|
989
|
+
threads,
|
|
990
|
+
unpinned,
|
|
991
|
+
..Pinning::default()
|
|
992
|
+
},
|
|
993
|
+
};
|
|
994
|
+
for (j, driver) in drivers.into_iter().enumerate() {
|
|
995
|
+
let vfs = Arc::clone(&config.vfs);
|
|
996
|
+
let (handle, ack) = spawn_pinned(
|
|
997
|
+
format!("pigeonhole-compaction-{j}"),
|
|
998
|
+
cpu(k + j),
|
|
999
|
+
move || pool::worker_main(driver, vfs),
|
|
1000
|
+
)?;
|
|
1001
|
+
rt.workers.push(handle);
|
|
1002
|
+
acks.push(ack);
|
|
1003
|
+
}
|
|
1004
|
+
let mut held: Vec<Vec<ShardCore<H>>> = (0..k).map(|_| Vec::new()).collect();
|
|
1005
|
+
for core in cores {
|
|
1006
|
+
held[drivers::Drivers::<H>::owner(core.id, k)].push(core);
|
|
1007
|
+
}
|
|
1008
|
+
for (d, cores) in held.into_iter().enumerate() {
|
|
1009
|
+
// A fixed thread per shard keeps the shard's name, as before D289; drivers whose
|
|
1010
|
+
// shards may move are named for themselves.
|
|
1011
|
+
let name = if k == config.shards && !config.adaptive_drivers {
|
|
1012
|
+
format!("pigeonhole-shard-{d}")
|
|
1013
|
+
} else {
|
|
1014
|
+
format!("pigeonhole-driver-{d}")
|
|
1015
|
+
};
|
|
1016
|
+
let shared = Arc::clone(&shared);
|
|
1017
|
+
let (handle, ack) =
|
|
1018
|
+
spawn_pinned(name, cpu(d), move || drivers::driver_main(shared, d, cores))?;
|
|
1019
|
+
rt.shards.push(handle);
|
|
1020
|
+
acks.push(ack);
|
|
1021
|
+
}
|
|
1022
|
+
let planned = plan.as_ref().map_or(0, pigeonhole_io::sys::PinPlan::len);
|
|
1023
|
+
// A thread that died before reporting surfaces its panic at shutdown. The compaction
|
|
1024
|
+
// threads' acks come first, then the drivers' in driver order.
|
|
1025
|
+
let first_driver = acks.len() - k;
|
|
1026
|
+
let mut pinned = 0;
|
|
1027
|
+
for (i, ack) in acks.into_iter().enumerate() {
|
|
1028
|
+
if ack.recv() == Ok(true) {
|
|
1029
|
+
pinned += 1;
|
|
1030
|
+
if let Some(c) = i.checked_sub(first_driver).and_then(cpu) {
|
|
1031
|
+
rt.driver_cpus.push(c);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
rt.pinning.pinned = pinned;
|
|
1036
|
+
rt.pinning.failed = planned.saturating_sub(pinned);
|
|
1037
|
+
rt.plan = plan;
|
|
1038
|
+
Ok(rt)
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/// Application-owned mode: no threads; one driver per shard.
|
|
1042
|
+
///
|
|
1043
|
+
/// The application owns every thread and background tasks run on the shards, so
|
|
1044
|
+
/// `config.pin_threads` is ignored and a nonzero `config.compaction_threads` fails with
|
|
1045
|
+
/// [`Error::InvalidConfig`] (decision D40) rather than being silently dropped: for
|
|
1046
|
+
/// background workers the application drives, use
|
|
1047
|
+
/// [`Runtime::application_owned_with_workers`] (D284).
|
|
1048
|
+
///
|
|
1049
|
+
/// # Panics
|
|
1050
|
+
/// If `handlers.len() != config.shards` or the count is not in `1..=65536`.
|
|
1051
|
+
pub fn application_owned(
|
|
1052
|
+
config: RuntimeConfig,
|
|
1053
|
+
handlers: Vec<H>,
|
|
1054
|
+
) -> Result<Vec<ShardDriver<H>>> {
|
|
1055
|
+
if config.compaction_threads != 0 {
|
|
1056
|
+
return Err(Error::InvalidConfig(
|
|
1057
|
+
"compaction_threads must be 0 in application-owned mode",
|
|
1058
|
+
));
|
|
1059
|
+
}
|
|
1060
|
+
let (_, cores) = build(&config, handlers, None);
|
|
1061
|
+
Ok(shard_drivers(cores))
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
/// Application-owned mode with background workers (D284): no threads; one driver per
|
|
1065
|
+
/// shard, and `config.compaction_threads` [`PoolDriver`]s the application drives from
|
|
1066
|
+
/// threads it owns, as engine-owned mode's compaction threads drive theirs. With 0 it is
|
|
1067
|
+
/// [`Runtime::application_owned`]. `config.pin_threads` is ignored.
|
|
1068
|
+
///
|
|
1069
|
+
/// The returned [`WorkerPool`] closes the workers ([`WorkerPool::close`]), taking what
|
|
1070
|
+
/// they hold back to the shards: a closing engine calls it first, so its close never
|
|
1071
|
+
/// waits for the application to drive a worker.
|
|
1072
|
+
///
|
|
1073
|
+
/// # Panics
|
|
1074
|
+
/// If `handlers.len() != config.shards` or the count is not in `1..=65536`.
|
|
1075
|
+
pub fn application_owned_with_workers(
|
|
1076
|
+
config: RuntimeConfig,
|
|
1077
|
+
handlers: Vec<H>,
|
|
1078
|
+
) -> Result<AppOwned<H>> {
|
|
1079
|
+
let (pool, workers) = if config.compaction_threads > 0 {
|
|
1080
|
+
let (pool, workers) = Pool::new(
|
|
1081
|
+
config.compaction_threads,
|
|
1082
|
+
false,
|
|
1083
|
+
Arc::clone(&config.vfs),
|
|
1084
|
+
config.slice_nanos(),
|
|
1085
|
+
);
|
|
1086
|
+
(Some(pool), workers)
|
|
1087
|
+
} else {
|
|
1088
|
+
(None, Vec::new())
|
|
1089
|
+
};
|
|
1090
|
+
let (_, cores) = build(&config, handlers, pool.as_ref());
|
|
1091
|
+
Ok(AppOwned {
|
|
1092
|
+
shards: shard_drivers(cores),
|
|
1093
|
+
workers,
|
|
1094
|
+
pool: pool.map(WorkerPool),
|
|
1095
|
+
})
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
/// Submitter for `shard`.
|
|
1099
|
+
///
|
|
1100
|
+
/// # Panics
|
|
1101
|
+
/// If `shard` is out of range.
|
|
1102
|
+
pub fn submitter(&self, shard: ShardId) -> Submitter<H::Msg> {
|
|
1103
|
+
self.submitters[usize::from(shard.0)].clone()
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
/// Number of shards.
|
|
1107
|
+
pub fn shard_count(&self) -> usize {
|
|
1108
|
+
self.submitters.len()
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
/// Whether the calling thread is a shard thread, and which (inline-write fast path).
|
|
1112
|
+
///
|
|
1113
|
+
/// True on engine-owned shard threads, and on an application thread while it is inside
|
|
1114
|
+
/// [`ShardDriver::run_once`] or [`ShardDriver::with_handler`].
|
|
1115
|
+
pub fn current_shard() -> Option<ShardId> {
|
|
1116
|
+
CURRENT_SHARD.with(Cell::get)
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
/// Closes every queue, lets each loop finish its queued messages, and joins the threads.
|
|
1120
|
+
///
|
|
1121
|
+
/// Returns the handlers in shard order. Unfinished background tasks are dropped. A
|
|
1122
|
+
/// message a shard sends to an already-closed shard during shutdown fails with
|
|
1123
|
+
/// [`Error::Closed`]. If a shard thread panicked, the panic resumes here.
|
|
1124
|
+
pub fn shutdown(mut self) -> Result<Vec<H>> {
|
|
1125
|
+
self.stop()
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
/// How this runtime's threads were pinned (D235): how many it started, how many got a
|
|
1129
|
+
/// CPU of their own, and why none did when pinning was asked for and refused.
|
|
1130
|
+
pub fn pinning(&self) -> Pinning {
|
|
1131
|
+
self.pinning
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
/// The CPUs the shard driver threads are pinned to, one per pinned driver, in driver
|
|
1135
|
+
/// order (D235, ICR 0101). Empty when none is pinned: `pin_threads` off, a platform or
|
|
1136
|
+
/// CPU set where pinning is unsafe, or every pin refused.
|
|
1137
|
+
pub fn pinned_driver_cpus(&self) -> &[usize] {
|
|
1138
|
+
&self.driver_cpus
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
/// The driver threads the shards run on now (D289): the controller's choice with
|
|
1142
|
+
/// [`RuntimeConfig::adaptive_drivers`], else the count started.
|
|
1143
|
+
pub fn driver_target(&self) -> usize {
|
|
1144
|
+
self.drivers.target()
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
/// Whether every shard runs on the driver [`driver_target`](Runtime::driver_target)
|
|
1148
|
+
/// puts it on (a shard moves only once its driver's ring is quiet).
|
|
1149
|
+
pub fn drivers_settled(&self) -> bool {
|
|
1150
|
+
self.drivers.settled()
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/// Fixes the driver target at `k`, or with `None` gives it back to the controller. For
|
|
1154
|
+
/// tests and benchmarks: moves shards as a resize would.
|
|
1155
|
+
#[doc(hidden)]
|
|
1156
|
+
pub fn force_driver_target(&self, k: Option<usize>) {
|
|
1157
|
+
self.drivers.force_target(k);
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
/// Shards moved between drivers so far (D289 PR 2).
|
|
1161
|
+
#[doc(hidden)]
|
|
1162
|
+
pub fn driver_moves(&self) -> u64 {
|
|
1163
|
+
self.drivers.moves()
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
/// The load controller's windows since the last call, one JSON object each (#1015). The
|
|
1167
|
+
/// first call starts the log; without the controller
|
|
1168
|
+
/// ([`RuntimeConfig::adaptive_drivers`]) it starts an observe-only one, which logs what
|
|
1169
|
+
/// it would decide but never resizes.
|
|
1170
|
+
#[doc(hidden)]
|
|
1171
|
+
pub fn driver_trace(&self) -> Vec<String> {
|
|
1172
|
+
self.drivers.trace()
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
/// [`force_driver_target`](Runtime::force_driver_target) as a handle another thread can
|
|
1176
|
+
/// call (a test's churn of resizes under traffic).
|
|
1177
|
+
#[doc(hidden)]
|
|
1178
|
+
pub fn driver_control(&self) -> impl Fn(Option<usize>) + Send + Sync + 'static {
|
|
1179
|
+
let drivers = Arc::clone(&self.drivers);
|
|
1180
|
+
move |k| drivers.force_target(k)
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
fn stop(&mut self) -> Result<Vec<H>> {
|
|
1184
|
+
// No more moves, and drivers holding no shard exit once the inboxes close.
|
|
1185
|
+
self.drivers.close();
|
|
1186
|
+
for s in self.submitters.iter() {
|
|
1187
|
+
s.inbox.close();
|
|
1188
|
+
}
|
|
1189
|
+
let mut handlers = Vec::with_capacity(self.submitters.len());
|
|
1190
|
+
let mut panic = None;
|
|
1191
|
+
for t in self.shards.drain(..) {
|
|
1192
|
+
match t.join() {
|
|
1193
|
+
Ok(hs) => handlers.extend(hs),
|
|
1194
|
+
Err(p) => panic = panic.or(Some(p)),
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
handlers.sort_unstable_by_key(|&(id, _)| id.0);
|
|
1198
|
+
let handlers = handlers.into_iter().map(|(_, h)| h).collect();
|
|
1199
|
+
// Shards are gone, so nothing spawns onto the pool any more.
|
|
1200
|
+
if let Some(pool) = &self.pool {
|
|
1201
|
+
pool.close_builtin();
|
|
1202
|
+
}
|
|
1203
|
+
for t in self.workers.drain(..) {
|
|
1204
|
+
if let Err(p) = t.join() {
|
|
1205
|
+
panic = panic.or(Some(p));
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
// Every thread is gone: its CPU is free for another runtime in this process.
|
|
1209
|
+
self.plan = None;
|
|
1210
|
+
if let Some(p) = panic {
|
|
1211
|
+
std::panic::resume_unwind(p);
|
|
1212
|
+
}
|
|
1213
|
+
Ok(handlers)
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
impl<H: ShardHandler> Drop for Runtime<H> {
|
|
1218
|
+
fn drop(&mut self) {
|
|
1219
|
+
if !self.shards.is_empty() || !self.workers.is_empty() {
|
|
1220
|
+
if thread::panicking() {
|
|
1221
|
+
// Close without joining: never double-panic.
|
|
1222
|
+
self.drivers.close();
|
|
1223
|
+
for s in self.submitters.iter() {
|
|
1224
|
+
s.inbox.close();
|
|
1225
|
+
}
|
|
1226
|
+
if let Some(pool) = &self.pool {
|
|
1227
|
+
pool.close_builtin();
|
|
1228
|
+
}
|
|
1229
|
+
} else {
|
|
1230
|
+
let _ = self.stop();
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
/// Wraps each shard's loop in its driver.
|
|
1237
|
+
fn shard_drivers<H: ShardHandler>(cores: Vec<ShardCore<H>>) -> Vec<ShardDriver<H>> {
|
|
1238
|
+
cores
|
|
1239
|
+
.into_iter()
|
|
1240
|
+
.map(|core| ShardDriver {
|
|
1241
|
+
_close: CloseOnDrop(core.submitters[usize::from(core.id.0)].clone()),
|
|
1242
|
+
core,
|
|
1243
|
+
wakes: Wakes::default(),
|
|
1244
|
+
})
|
|
1245
|
+
.collect()
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
/// What [`Runtime::application_owned_with_workers`] hands the application (D284).
|
|
1249
|
+
#[derive(Debug)]
|
|
1250
|
+
#[non_exhaustive]
|
|
1251
|
+
pub struct AppOwned<H: ShardHandler> {
|
|
1252
|
+
/// One driver per shard, in shard order.
|
|
1253
|
+
pub shards: Vec<ShardDriver<H>>,
|
|
1254
|
+
/// The background workers, for threads the application owns.
|
|
1255
|
+
pub workers: Vec<PoolDriver>,
|
|
1256
|
+
/// Closes the workers (`None` without any).
|
|
1257
|
+
pub pool: Option<WorkerPool>,
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
/// Application-owned mode: drives one shard from a thread the application owns.
|
|
1261
|
+
///
|
|
1262
|
+
/// Call [`run_once`](ShardDriver::run_once) until it returns `false`, then wait for the
|
|
1263
|
+
/// wakeup registered with [`set_wakeup`](ShardDriver::set_wakeup) (which fires once per
|
|
1264
|
+
/// idle period, when work arrives) before calling it again.
|
|
1265
|
+
///
|
|
1266
|
+
/// [`ShardDriver::shutdown`] closes the shard, handles every queued message and returns the
|
|
1267
|
+
/// handler, like [`Runtime::shutdown`]. Dropping the driver instead closes the shard and
|
|
1268
|
+
/// **discards** what is queued: queued messages are dropped unhandled (their [`Notifier`]s
|
|
1269
|
+
/// resolve waiters with `None`) and background tasks are dropped. Either way, later submits
|
|
1270
|
+
/// fail with [`Error::Closed`].
|
|
1271
|
+
///
|
|
1272
|
+
/// ```
|
|
1273
|
+
/// use pigeonhole_io::sim::SimVfs;
|
|
1274
|
+
/// use pigeonhole_runtime::{Runtime, RuntimeConfig, ShardContext, ShardHandler, ShardId};
|
|
1275
|
+
///
|
|
1276
|
+
/// struct Log(Vec<u32>);
|
|
1277
|
+
///
|
|
1278
|
+
/// impl ShardHandler for Log {
|
|
1279
|
+
/// type Msg = u32;
|
|
1280
|
+
/// fn handle(&mut self, _ctx: &mut ShardContext<'_, u32>, msg: u32) {
|
|
1281
|
+
/// self.0.push(msg);
|
|
1282
|
+
/// }
|
|
1283
|
+
/// fn end_batch(&mut self, _ctx: &mut ShardContext<'_, u32>) {}
|
|
1284
|
+
/// }
|
|
1285
|
+
///
|
|
1286
|
+
/// let mut config = RuntimeConfig::new(SimVfs::new(7));
|
|
1287
|
+
/// config.shards = 1;
|
|
1288
|
+
/// let mut drivers = Runtime::application_owned(config, vec![Log(Vec::new())])?;
|
|
1289
|
+
/// let shard = &mut drivers[0];
|
|
1290
|
+
/// shard.submitter(ShardId(0)).submit(1)?;
|
|
1291
|
+
/// shard.submitter(ShardId(0)).submit(2)?;
|
|
1292
|
+
/// assert!(!shard.run_once(u64::MAX)); // drained; no work remains
|
|
1293
|
+
/// // The application's own write, inline on its own core:
|
|
1294
|
+
/// shard.with_handler(|log, _ctx| log.0.push(3));
|
|
1295
|
+
/// assert_eq!(shard.with_handler(|log, _| log.0.clone()), [1, 2, 3]);
|
|
1296
|
+
/// # Ok::<(), pigeonhole_runtime::Error>(())
|
|
1297
|
+
/// ```
|
|
1298
|
+
pub struct ShardDriver<H: ShardHandler> {
|
|
1299
|
+
core: ShardCore<H>,
|
|
1300
|
+
_close: CloseOnDrop<H::Msg>,
|
|
1301
|
+
/// Who a wake reaches: the application's callback ([`ShardDriver::set_wakeup`]) and the
|
|
1302
|
+
/// thread in [`ShardDriver::wait`].
|
|
1303
|
+
wakes: Wakes,
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
/// What a wake of an application-owned shard (or worker) calls, composed into one wake
|
|
1307
|
+
/// target.
|
|
1308
|
+
#[derive(Default)]
|
|
1309
|
+
pub(crate) struct Wakes {
|
|
1310
|
+
pub(crate) callback: Option<Arc<dyn Fn() + Send + Sync>>,
|
|
1311
|
+
/// The thread that last waited, and its ring's waker if it has a ring.
|
|
1312
|
+
pub(crate) waiter: Option<(thread::Thread, Option<pigeonhole_io::OwnIoWaker>)>,
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
impl Wakes {
|
|
1316
|
+
/// The wake target: the callback, then the waiting thread (its ring's waker and an
|
|
1317
|
+
/// unpark: it waits in one or the other). Without a callback, the waiting thread is the
|
|
1318
|
+
/// engine-owned thread's own target, so a commit's wake costs no closure call.
|
|
1319
|
+
pub(crate) fn target(&self) -> WakeTarget {
|
|
1320
|
+
let callback = self.callback.clone();
|
|
1321
|
+
let waiter = self.waiter.clone();
|
|
1322
|
+
match (callback, waiter) {
|
|
1323
|
+
(None, None) => WakeTarget::None,
|
|
1324
|
+
(Some(cb), None) => WakeTarget::Callback(cb),
|
|
1325
|
+
(None, Some((thread, None))) => WakeTarget::Thread(thread),
|
|
1326
|
+
(None, Some((thread, Some(ring)))) => WakeTarget::ThreadRing(thread, ring),
|
|
1327
|
+
(Some(cb), Some((thread, ring))) => WakeTarget::Callback(Arc::new(move || {
|
|
1328
|
+
cb();
|
|
1329
|
+
if let Some(ring) = &ring {
|
|
1330
|
+
ring.wake();
|
|
1331
|
+
}
|
|
1332
|
+
thread.unpark();
|
|
1333
|
+
})),
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
/// Ends a [`ShardDriver::wait`] (or [`PoolDriver::wait`]) from any thread.
|
|
1339
|
+
pub(crate) struct WaitWaker(pub(crate) Arc<Signal>);
|
|
1340
|
+
|
|
1341
|
+
impl std::task::Wake for WaitWaker {
|
|
1342
|
+
fn wake(self: Arc<Self>) {
|
|
1343
|
+
self.0.notify_app();
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
fn wake_by_ref(self: &Arc<Self>) {
|
|
1347
|
+
self.0.notify_app();
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
/// Refuses further submits once the driver is gone (shut down or dropped).
|
|
1352
|
+
struct CloseOnDrop<M>(Submitter<M>);
|
|
1353
|
+
|
|
1354
|
+
impl<M> Drop for CloseOnDrop<M> {
|
|
1355
|
+
fn drop(&mut self) {
|
|
1356
|
+
self.0.inbox.gate.close();
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
impl<H: ShardHandler> fmt::Debug for ShardDriver<H> {
|
|
1361
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
1362
|
+
f.debug_struct("ShardDriver")
|
|
1363
|
+
.field("shard", &self.core.id)
|
|
1364
|
+
.field("tasks", &self.core.spawner.local)
|
|
1365
|
+
.finish_non_exhaustive()
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
impl<H: ShardHandler> ShardDriver<H> {
|
|
1370
|
+
/// This shard.
|
|
1371
|
+
pub fn shard(&self) -> ShardId {
|
|
1372
|
+
self.core.id
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
/// Submitter for any shard.
|
|
1376
|
+
///
|
|
1377
|
+
/// # Panics
|
|
1378
|
+
/// If `shard` is out of range.
|
|
1379
|
+
pub fn submitter(&self, shard: ShardId) -> Submitter<H::Msg> {
|
|
1380
|
+
self.core.submitters[usize::from(shard.0)].clone()
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
/// Drains queued messages, calls `end_batch`, then runs background tasks until
|
|
1384
|
+
/// `deadline_nanos`. Returns whether work remains.
|
|
1385
|
+
///
|
|
1386
|
+
/// Between task slices (each at most `time_slice` long) it drains the queue again, so
|
|
1387
|
+
/// foreground messages never wait behind more than one slice.
|
|
1388
|
+
///
|
|
1389
|
+
/// When a [`waker`](Self::waker) wake arrived since the last turn (typically a message
|
|
1390
|
+
/// this turn handled settled a future the calling thread awaits), it returns `true` right
|
|
1391
|
+
/// after the drain, before the background tasks, so the caller can poll that future now
|
|
1392
|
+
/// rather than at the deadline (D237). The tasks run on the next call; after eight such
|
|
1393
|
+
/// turns in a row, a turn runs them anyway. The wake still ends the next
|
|
1394
|
+
/// [`wait`](Self::wait) at once.
|
|
1395
|
+
///
|
|
1396
|
+
/// Tasks sleeping until a deadline ([`TaskPoll::SleepUntil`]) are not work that remains:
|
|
1397
|
+
/// with only those left it returns `false`, and the application should call it again
|
|
1398
|
+
/// by [`next_deadline`](ShardDriver::next_deadline) even if no wakeup arrives.
|
|
1399
|
+
pub fn run_once(&mut self, deadline_nanos: u64) -> bool {
|
|
1400
|
+
self.core.run_once(deadline_nanos)
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
/// How many messages this shard has handled and background slices it has run, in all.
|
|
1404
|
+
/// For tests that drive shards by hand: `run_once` returning `false` says no work
|
|
1405
|
+
/// *remains* on this shard, not that it did none, and a message it sent another shard is
|
|
1406
|
+
/// that shard's work. A pass in which every shard's `run_once` returned `false` and no
|
|
1407
|
+
/// shard's count moved handled nothing, so it sent nothing and left nothing queued.
|
|
1408
|
+
#[doc(hidden)]
|
|
1409
|
+
pub fn work_count(&self) -> u64 {
|
|
1410
|
+
self.core.work_done
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
/// Before handing this shard to another thread: drives it until the calling thread's
|
|
1414
|
+
/// I/O ring has nothing in flight (#492, ICR 0029). A backend with a ring per driving
|
|
1415
|
+
/// thread (io_uring in application-owned mode) lets only that thread complete what was
|
|
1416
|
+
/// submitted to it, so a shard moved with I/O still there would wait on it for ever if
|
|
1417
|
+
/// this thread stopped running turns. Returns at once without such rings (the pread
|
|
1418
|
+
/// and synchronous backends), or on a thread that has not run this shard.
|
|
1419
|
+
pub fn release(&mut self) {
|
|
1420
|
+
self.core.release();
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
/// The earliest deadline (VFS `monotonic_nanos`) of a background task sleeping on this
|
|
1424
|
+
/// shard, or `None`. After [`run_once`](ShardDriver::run_once) returns `false`, the
|
|
1425
|
+
/// application sleeps until the wakeup registered with
|
|
1426
|
+
/// [`set_wakeup`](ShardDriver::set_wakeup) fires or this deadline passes, whichever
|
|
1427
|
+
/// comes first.
|
|
1428
|
+
///
|
|
1429
|
+
/// ```
|
|
1430
|
+
/// use pigeonhole_io::Vfs;
|
|
1431
|
+
/// use pigeonhole_io::sim::SimVfs;
|
|
1432
|
+
/// use pigeonhole_runtime::{
|
|
1433
|
+
/// Runtime, RuntimeConfig, ShardContext, ShardHandler, Task, TaskPoll, TaskWaker,
|
|
1434
|
+
/// };
|
|
1435
|
+
///
|
|
1436
|
+
/// /// Fires once the clock reaches `at`.
|
|
1437
|
+
/// struct Alarm {
|
|
1438
|
+
/// vfs: SimVfsRef,
|
|
1439
|
+
/// at: u64,
|
|
1440
|
+
/// }
|
|
1441
|
+
/// type SimVfsRef = std::sync::Arc<SimVfs>;
|
|
1442
|
+
///
|
|
1443
|
+
/// impl Task for Alarm {
|
|
1444
|
+
/// fn run(&mut self, _deadline: u64, _waker: &TaskWaker) -> TaskPoll {
|
|
1445
|
+
/// if self.vfs.monotonic_nanos() >= self.at {
|
|
1446
|
+
/// TaskPoll::Done
|
|
1447
|
+
/// } else {
|
|
1448
|
+
/// TaskPoll::SleepUntil(self.at)
|
|
1449
|
+
/// }
|
|
1450
|
+
/// }
|
|
1451
|
+
/// fn name(&self) -> &'static str {
|
|
1452
|
+
/// "alarm"
|
|
1453
|
+
/// }
|
|
1454
|
+
/// }
|
|
1455
|
+
///
|
|
1456
|
+
/// struct Idle;
|
|
1457
|
+
/// impl ShardHandler for Idle {
|
|
1458
|
+
/// type Msg = ();
|
|
1459
|
+
/// fn handle(&mut self, _ctx: &mut ShardContext<'_, ()>, _msg: ()) {}
|
|
1460
|
+
/// fn end_batch(&mut self, _ctx: &mut ShardContext<'_, ()>) {}
|
|
1461
|
+
/// }
|
|
1462
|
+
///
|
|
1463
|
+
/// let vfs = SimVfs::new(1);
|
|
1464
|
+
/// let mut config = RuntimeConfig::new(vfs.clone());
|
|
1465
|
+
/// config.shards = 1;
|
|
1466
|
+
/// let mut drivers = Runtime::application_owned(config, vec![Idle])?;
|
|
1467
|
+
/// let shard = &mut drivers[0];
|
|
1468
|
+
/// let at = vfs.monotonic_nanos() + 5_000;
|
|
1469
|
+
/// shard.with_handler(|_, ctx| ctx.spawn(Box::new(Alarm { vfs: vfs.clone(), at })));
|
|
1470
|
+
/// assert!(!shard.run_once(u64::MAX)); // only a sleeping task: idle
|
|
1471
|
+
/// assert_eq!(shard.next_deadline(), Some(at));
|
|
1472
|
+
/// vfs.advance(5_000);
|
|
1473
|
+
/// assert!(!shard.run_once(u64::MAX)); // due: it ran and finished
|
|
1474
|
+
/// assert_eq!(shard.next_deadline(), None);
|
|
1475
|
+
/// # Ok::<(), pigeonhole_runtime::Error>(())
|
|
1476
|
+
/// ```
|
|
1477
|
+
pub fn next_deadline(&self) -> Option<u64> {
|
|
1478
|
+
self.core.next_deadline()
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
/// Runs `f` on this shard's handler inline (the application's own writes on its own
|
|
1482
|
+
/// core, without a queue hop).
|
|
1483
|
+
pub fn with_handler<R>(
|
|
1484
|
+
&mut self,
|
|
1485
|
+
f: impl FnOnce(&mut H, &mut ShardContext<'_, H::Msg>) -> R,
|
|
1486
|
+
) -> R {
|
|
1487
|
+
let _shard = EnterShard::new(self.core.id);
|
|
1488
|
+
let (handler, mut ctx) = self.core.parts();
|
|
1489
|
+
f(handler, &mut ctx)
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
/// Registers a waker the runtime calls when work arrives (for the application's event
|
|
1493
|
+
/// loop).
|
|
1494
|
+
///
|
|
1495
|
+
/// It is called from the submitting thread, at most once per idle period (after
|
|
1496
|
+
/// [`run_once`](ShardDriver::run_once) returned `false`), so it should be cheap: set a
|
|
1497
|
+
/// flag, unpark a thread, or write an eventfd. It is also called once right away, since
|
|
1498
|
+
/// work may have arrived before it was registered.
|
|
1499
|
+
pub fn set_wakeup(&mut self, wake: Box<dyn Fn() + Send + Sync>) {
|
|
1500
|
+
let wake: Arc<dyn Fn() + Send + Sync> = Arc::from(wake);
|
|
1501
|
+
self.wakes.callback = Some(Arc::clone(&wake));
|
|
1502
|
+
self.core.signal().set_target(self.wakes.target());
|
|
1503
|
+
// A submit that found the shard idle before the target existed woke nobody; a
|
|
1504
|
+
// spurious wake is harmless, a lost one is not.
|
|
1505
|
+
wake();
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
/// Waits until this shard has work again: a message arrives, a [`waker`](Self::waker)
|
|
1509
|
+
/// fires, the calling thread's own I/O completes, the next background deadline
|
|
1510
|
+
/// ([`next_deadline`](Self::next_deadline)) passes, or `timeout` passes (#553, ICR
|
|
1511
|
+
/// 0035). Call it after [`run_once`](Self::run_once) returns `false`, on the thread
|
|
1512
|
+
/// that runs the shard; a spurious return is possible, so loop on `run_once`. It needs no
|
|
1513
|
+
/// completion fd: with io_uring it waits in the thread's ring while its own I/O is in
|
|
1514
|
+
/// flight, and parks otherwise. It composes with [`set_wakeup`](Self::set_wakeup), whose
|
|
1515
|
+
/// callback still fires. A thread that drives several shards from one loop waits in its
|
|
1516
|
+
/// own event loop instead (the wakeup callbacks and the I/O completion fd).
|
|
1517
|
+
pub fn wait(&mut self, timeout: Duration) {
|
|
1518
|
+
let me = thread::current();
|
|
1519
|
+
if self.wakes.waiter.as_ref().map(|(t, _)| t.id()) != Some(me.id()) {
|
|
1520
|
+
self.wakes.waiter = Some((me, pigeonhole_io::own_io_waker()));
|
|
1521
|
+
self.core.signal().set_target(self.wakes.target());
|
|
1522
|
+
}
|
|
1523
|
+
self.core.wait(timeout);
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
/// A waker that ends this shard's [`wait`](Self::wait) from any thread: for futures the
|
|
1527
|
+
/// driving thread polls itself (a commit's future, resolved on another shard's thread
|
|
1528
|
+
/// or by this shard during [`run_once`](Self::run_once)). Waking it when nobody waits
|
|
1529
|
+
/// only makes the next `wait` return at once, even if a turn ran in between (#592).
|
|
1530
|
+
pub fn waker(&self) -> std::task::Waker {
|
|
1531
|
+
std::task::Waker::from(Arc::new(WaitWaker(Arc::clone(&self.core.inbox().signal))))
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
/// Closes the shard, waits for in-flight submits, handles every queued message (calling
|
|
1535
|
+
/// `end_batch` per batch) and returns the handler. Unfinished background tasks are
|
|
1536
|
+
/// dropped. Later submits fail with [`Error::Closed`].
|
|
1537
|
+
pub fn shutdown(self) -> H {
|
|
1538
|
+
let ShardDriver {
|
|
1539
|
+
mut core, _close, ..
|
|
1540
|
+
} = self;
|
|
1541
|
+
let _shard = EnterShard::new(core.id);
|
|
1542
|
+
core.inbox().gate.close();
|
|
1543
|
+
core.finish();
|
|
1544
|
+
core.handler
|
|
1545
|
+
}
|
|
1546
|
+
}
|