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,1609 @@
|
|
|
1
|
+
//! The mapped region: lifecycle (create, attach, rebuild, remove), the seqno and watermark
|
|
2
|
+
//! protocol, view publication and the reader-slot table. Layout per `FORMAT.md` §11; the
|
|
3
|
+
//! offsets come from `pigeonhole_format::shm`.
|
|
4
|
+
|
|
5
|
+
use std::path::Path;
|
|
6
|
+
use std::sync::atomic::{AtomicBool, AtomicU32, AtomicU64, Ordering};
|
|
7
|
+
use std::sync::{Arc, Mutex, PoisonError};
|
|
8
|
+
|
|
9
|
+
use pigeonhole_format::shm::{
|
|
10
|
+
DIRECTORY_MAGIC, HEADER_LEN, READER_SLOT_LEN, ROW_EPOCH_LEN, ShmHeader, ViewRecord,
|
|
11
|
+
WATERMARK_STRIDE, directory, directory_name, header, reader_slot, region_name, watermark,
|
|
12
|
+
};
|
|
13
|
+
use pigeonhole_format::superblock::READER_LOCK_BASE;
|
|
14
|
+
use pigeonhole_format::{ManifestVersion, Seqno, ShmLayoutVersion};
|
|
15
|
+
use pigeonhole_io::{
|
|
16
|
+
ErrorKind, FileIdentity, FileRef, LockMode, ProcessId, SharedOpen, SharedRegion, VfsRef,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
use crate::lock::{ShmInit, alone, present};
|
|
20
|
+
use crate::{Error, Generation, ReaderSlot, Result, Role, ShmConfig};
|
|
21
|
+
|
|
22
|
+
/// `state` values of the region header.
|
|
23
|
+
const STATE_INITIALIZING: u32 = 0;
|
|
24
|
+
const STATE_READY: u32 = 1;
|
|
25
|
+
const STATE_ABANDONED: u32 = 2;
|
|
26
|
+
|
|
27
|
+
/// `state` values of a reader slot.
|
|
28
|
+
const SLOT_FREE: u32 = 0;
|
|
29
|
+
const SLOT_CLAIMING: u32 = 1;
|
|
30
|
+
const SLOT_ACTIVE: u32 = 2;
|
|
31
|
+
|
|
32
|
+
/// Directory `format` field.
|
|
33
|
+
const DIRECTORY_FORMAT: u32 = 1;
|
|
34
|
+
|
|
35
|
+
/// Longest region name the smallest platform limit accepts: macOS `shm_open` allows 31 bytes
|
|
36
|
+
/// including the leading `/` it needs.
|
|
37
|
+
const MAX_REGION_NAME: usize = 30;
|
|
38
|
+
|
|
39
|
+
/// How long a reader waits for a region still marked `initializing`. The builder holds the
|
|
40
|
+
/// shm-init lock until the region is ready and records its generation in the directory only
|
|
41
|
+
/// then, so this is a guard against a corrupt directory, not a normal wait.
|
|
42
|
+
const READY_WAIT_ATTEMPTS: u32 = 100;
|
|
43
|
+
const READY_WAIT_DELAY: std::time::Duration = std::time::Duration::from_millis(1);
|
|
44
|
+
|
|
45
|
+
/// Consecutive bad copies of an unchanged view buffer before `read_view` gives up.
|
|
46
|
+
const VIEW_READ_ATTEMPTS: u32 = 8;
|
|
47
|
+
|
|
48
|
+
/// Size of the fixed part of a view record (`FORMAT.md` §11.4).
|
|
49
|
+
const VIEW_HEADER_LEN: usize = 32;
|
|
50
|
+
|
|
51
|
+
/// A stream's change-feed marks as a reader loaded them ([`ShmRegion::feed_marks`]).
|
|
52
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
53
|
+
pub struct FeedMarksView {
|
|
54
|
+
/// The smallest epoch not yet recyclable.
|
|
55
|
+
pub floor: u32,
|
|
56
|
+
/// The checkpoint `Lsn`'s raw value.
|
|
57
|
+
pub checkpoint: u64,
|
|
58
|
+
/// The largest start bound the retained history can't serve.
|
|
59
|
+
pub bound: u64,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// The mapped region for one database.
|
|
63
|
+
///
|
|
64
|
+
/// Cheap to clone: every clone shares one mapping. See the [crate docs](crate) for the
|
|
65
|
+
/// lifecycle and an example.
|
|
66
|
+
#[derive(Debug, Clone)]
|
|
67
|
+
pub struct ShmRegion {
|
|
68
|
+
inner: Arc<Inner>,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// Everything a mapping needs, shared by the region's clones and its reader slots.
|
|
72
|
+
#[derive(Debug)]
|
|
73
|
+
pub(crate) struct Inner {
|
|
74
|
+
region: SharedRegion,
|
|
75
|
+
/// The directory region; `None` for [`ShmRegion::in_memory`].
|
|
76
|
+
directory: Option<SharedRegion>,
|
|
77
|
+
header: ShmHeader,
|
|
78
|
+
generation: Generation,
|
|
79
|
+
db_id: [u8; 16],
|
|
80
|
+
identity: FileIdentity,
|
|
81
|
+
config: ShmConfig,
|
|
82
|
+
/// Serializes in-process publishers (`publish_view` writes the inactive buffer, then
|
|
83
|
+
/// swaps). Across processes the writer lock already allows one publisher.
|
|
84
|
+
/// Serializes view publishes; holds the encoding buffer they reuse (#499).
|
|
85
|
+
publish_lock: Mutex<Vec<u8>>,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
impl Inner {
|
|
89
|
+
fn h32(&self, offset: usize) -> &AtomicU32 {
|
|
90
|
+
self.region.atomic_u32(offset)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fn h64(&self, offset: usize) -> &AtomicU64 {
|
|
94
|
+
self.region.atomic_u64(offset)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fn pending(&self, shard: u32) -> &AtomicU64 {
|
|
98
|
+
assert!(
|
|
99
|
+
shard < self.header.shard_count,
|
|
100
|
+
"shard {shard} out of range (region has {} shards)",
|
|
101
|
+
self.header.shard_count
|
|
102
|
+
);
|
|
103
|
+
let off = self.header.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
104
|
+
self.region.atomic_u64(off + watermark::PENDING)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
fn durable(&self, shard: u32) -> &AtomicU64 {
|
|
108
|
+
assert!(
|
|
109
|
+
shard < self.header.shard_count,
|
|
110
|
+
"shard {shard} out of range (region has {} shards)",
|
|
111
|
+
self.header.shard_count
|
|
112
|
+
);
|
|
113
|
+
let off = self.header.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
114
|
+
self.region.atomic_u64(off + watermark::DURABLE)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
fn written(&self, shard: u32) -> &AtomicU64 {
|
|
118
|
+
assert!(
|
|
119
|
+
shard < self.header.shard_count,
|
|
120
|
+
"shard {shard} out of range (region has {} shards)",
|
|
121
|
+
self.header.shard_count
|
|
122
|
+
);
|
|
123
|
+
let off = self.header.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
124
|
+
self.region.atomic_u64(off + watermark::WRITTEN)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// One of `shard`'s change-feed marks (layout version 8): `field` is
|
|
128
|
+
/// [`watermark::FEED_FLOOR`], [`watermark::FEED_CKPT`] or [`watermark::FEED_BOUND`].
|
|
129
|
+
fn feed_mark(&self, shard: u32, field: usize) -> &AtomicU64 {
|
|
130
|
+
assert!(
|
|
131
|
+
shard < self.header.shard_count,
|
|
132
|
+
"shard {shard} out of range (region has {} shards)",
|
|
133
|
+
self.header.shard_count
|
|
134
|
+
);
|
|
135
|
+
let off = self.header.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
136
|
+
self.region.atomic_u64(off + field)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
fn synced(&self, shard: u32) -> &AtomicU64 {
|
|
140
|
+
assert!(
|
|
141
|
+
shard < self.header.shard_count,
|
|
142
|
+
"shard {shard} out of range (region has {} shards)",
|
|
143
|
+
self.header.shard_count
|
|
144
|
+
);
|
|
145
|
+
let off = self.header.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
146
|
+
self.region.atomic_u64(off + watermark::SYNCED)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// The change feed's frontier (D310): as [`visible_seqno`](Self::visible_seqno), or as
|
|
150
|
+
/// [`durable_seqno`](Self::durable_seqno) with `durable`, and also below every shard's
|
|
151
|
+
/// written watermark (and, with `durable`, its synced one). Per shard, `pending` (and
|
|
152
|
+
/// `durable`) first, then `written` (and `synced`), all Acquire: a shard stores those
|
|
153
|
+
/// before `pending` lets a seqno go.
|
|
154
|
+
fn written_seqno(&self, durable: bool) -> Seqno {
|
|
155
|
+
let (next, held) = self.next_and_held();
|
|
156
|
+
let mut lowest = next.min(held);
|
|
157
|
+
for shard in 0..self.header.shard_count {
|
|
158
|
+
lowest = lowest.min(self.pending(shard).load(Ordering::Acquire));
|
|
159
|
+
if durable {
|
|
160
|
+
lowest = lowest.min(self.durable(shard).load(Ordering::Acquire));
|
|
161
|
+
}
|
|
162
|
+
lowest = lowest.min(self.written(shard).load(Ordering::Acquire));
|
|
163
|
+
if durable {
|
|
164
|
+
lowest = lowest.min(self.synced(shard).load(Ordering::Acquire));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
lowest.saturating_sub(1)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
fn slot_off(&self, index: u32) -> usize {
|
|
171
|
+
self.header.reader_slots_off as usize + READER_SLOT_LEN * index as usize
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
fn slot32(&self, index: u32, field: usize) -> &AtomicU32 {
|
|
175
|
+
self.region.atomic_u32(self.slot_off(index) + field)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
fn slot64(&self, index: u32, field: usize) -> &AtomicU64 {
|
|
179
|
+
self.region.atomic_u64(self.slot_off(index) + field)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
fn view_pointer(&self, order: Ordering) -> u64 {
|
|
183
|
+
self.h64(header::VIEW_POINTER).load(order)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/// `NEXT_SEQNO` then `CROSS_HELD` (Acquire, in that order: FORMAT §11.3), through one
|
|
187
|
+
/// checked run of header words rather than two checked accesses.
|
|
188
|
+
#[inline(always)]
|
|
189
|
+
fn next_and_held(&self) -> (Seqno, Seqno) {
|
|
190
|
+
const WORDS: usize = (header::CROSS_HELD - header::NEXT_SEQNO) / 8 + 1;
|
|
191
|
+
const _: () = assert!(
|
|
192
|
+
header::CROSS_HELD > header::NEXT_SEQNO
|
|
193
|
+
&& (header::CROSS_HELD - header::NEXT_SEQNO).is_multiple_of(8)
|
|
194
|
+
);
|
|
195
|
+
let words = self.region.atomic_u64s(header::NEXT_SEQNO, WORDS);
|
|
196
|
+
let next = words[0].load(Ordering::Acquire);
|
|
197
|
+
// After `NEXT_SEQNO`: a decision holds its seqno here before the mirror passes it.
|
|
198
|
+
(next, words[WORDS - 1].load(Ordering::Acquire))
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
fn visible_seqno(&self) -> Seqno {
|
|
202
|
+
let (next, held) = self.next_and_held();
|
|
203
|
+
let mut lowest = next.min(held);
|
|
204
|
+
for shard in 0..self.header.shard_count {
|
|
205
|
+
lowest = lowest.min(self.pending(shard).load(Ordering::Acquire));
|
|
206
|
+
}
|
|
207
|
+
lowest.saturating_sub(1)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/// As [`visible_seqno`](Self::visible_seqno), also below every shard's durable
|
|
211
|
+
/// watermark: never above the visible seqno.
|
|
212
|
+
fn durable_seqno(&self) -> Seqno {
|
|
213
|
+
let (next, held) = self.next_and_held();
|
|
214
|
+
let mut lowest = next.min(held);
|
|
215
|
+
for shard in 0..self.header.shard_count {
|
|
216
|
+
lowest = lowest
|
|
217
|
+
.min(self.pending(shard).load(Ordering::Acquire))
|
|
218
|
+
.min(self.durable(shard).load(Ordering::Acquire));
|
|
219
|
+
}
|
|
220
|
+
lowest.saturating_sub(1)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
fn clear_pins(&self, index: u32) {
|
|
224
|
+
self.slot64(index, reader_slot::PINNED_SEQNO)
|
|
225
|
+
.store(0, Ordering::SeqCst);
|
|
226
|
+
self.slot64(index, reader_slot::PINNED_VIEW)
|
|
227
|
+
.store(0, Ordering::SeqCst);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// Whether slot `index` is claimed (not free) and records `owner` as its process.
|
|
231
|
+
pub(crate) fn slot_owned_by(&self, index: u32, owner: ProcessId) -> bool {
|
|
232
|
+
self.slot32(index, reader_slot::STATE)
|
|
233
|
+
.load(Ordering::Acquire)
|
|
234
|
+
!= SLOT_FREE
|
|
235
|
+
&& self.slot32(index, reader_slot::PID).load(Ordering::Relaxed) == owner.pid
|
|
236
|
+
&& self
|
|
237
|
+
.slot64(index, reader_slot::START_TIME)
|
|
238
|
+
.load(Ordering::Relaxed)
|
|
239
|
+
== owner.start_time
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/// The owner frees its slot: pins first, so a concurrent
|
|
243
|
+
/// [`ShmRegion::oldest_reader_pin`] never sees a free slot still pinning, then `active`
|
|
244
|
+
/// to `free`. The CAS fails only while the writer has the slot in `claiming` to check
|
|
245
|
+
/// its owner's liveness ([`ShmRegion::reclaim_dead_slots_locked`]); the writer puts it
|
|
246
|
+
/// back to `active` at once because the owner is alive, so retry. If the writer died in that
|
|
247
|
+
/// window the slot stays `claiming`; give up and leave it to the next generation.
|
|
248
|
+
///
|
|
249
|
+
/// Every store an owner makes to its slot (here, and its pins) is to its own slot
|
|
250
|
+
/// (#693 PR 3, perf287's review of #894): a slot claimed with its liveness lock
|
|
251
|
+
/// ([`ShmRegion::claim_reader_slot_locked`]) is freed only by a handle that has taken
|
|
252
|
+
/// that lock ([`ShmRegion::reclaim_dead_slots_locked`]), and the owner holds it from
|
|
253
|
+
/// before its claim until after this release. So the slot cannot be freed and handed to
|
|
254
|
+
/// another reader under a live owner. The ownership check below is a guard for a handle
|
|
255
|
+
/// whose slot was freed after it gave up its lock ([`ReaderSlot::abandon`]).
|
|
256
|
+
fn release_slot(&self, index: u32, owner: ProcessId) {
|
|
257
|
+
if !self.slot_owned_by(index, owner) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
self.clear_pins(index);
|
|
261
|
+
let state = self.slot32(index, reader_slot::STATE);
|
|
262
|
+
for attempt in 0..RELEASE_ATTEMPTS {
|
|
263
|
+
if state
|
|
264
|
+
.compare_exchange(SLOT_ACTIVE, SLOT_FREE, Ordering::AcqRel, Ordering::Acquire)
|
|
265
|
+
.is_ok()
|
|
266
|
+
{
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if attempt < 64 {
|
|
270
|
+
std::thread::yield_now();
|
|
271
|
+
} else {
|
|
272
|
+
std::thread::sleep(std::time::Duration::from_millis(1));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/// Retries of the owner's `active -> free` transition while the writer probes the slot.
|
|
279
|
+
const RELEASE_ATTEMPTS: u32 = 64 + 200;
|
|
280
|
+
|
|
281
|
+
/// Maps a failure to create a region: `Unavailable` when it could not be allocated (no
|
|
282
|
+
/// space, or no such directory: `/dev/shm` missing in a distroless or Lambda container, or a
|
|
283
|
+
/// bad `shm_dir`), `Io` for anything else.
|
|
284
|
+
fn unavailable(e: pigeonhole_io::Error) -> Error {
|
|
285
|
+
match e.kind {
|
|
286
|
+
ErrorKind::NoSpace | ErrorKind::NotFound | ErrorKind::Other => Error::Unavailable,
|
|
287
|
+
_ => Error::Io(e),
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
fn io_error(kind: ErrorKind, context: &'static str) -> Error {
|
|
292
|
+
Error::Io(pigeonhole_io::Error::new(kind, context))
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/// `None` for a name that does not exist; any other failure is an error.
|
|
296
|
+
fn unless_missing<T>(r: pigeonhole_io::Result<T>) -> Result<Option<T>> {
|
|
297
|
+
match r {
|
|
298
|
+
Ok(v) => Ok(Some(v)),
|
|
299
|
+
Err(e) if e.kind == ErrorKind::NotFound => Ok(None),
|
|
300
|
+
Err(e) => Err(e.into()),
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/// A seed for a new generation's row-epoch hash (D281): unpredictable from outside the
|
|
305
|
+
/// process (`foldhash`'s per-process random state), different per generation.
|
|
306
|
+
fn row_epoch_seed(generation: Generation, writer: ProcessId) -> u64 {
|
|
307
|
+
use std::hash::BuildHasher;
|
|
308
|
+
let now = std::time::SystemTime::now()
|
|
309
|
+
.duration_since(std::time::UNIX_EPOCH)
|
|
310
|
+
.map_or(0, |d| d.as_nanos());
|
|
311
|
+
pigeonhole_format::hash::FastBuildHasher::default().hash_one((
|
|
312
|
+
generation.0,
|
|
313
|
+
writer.pid,
|
|
314
|
+
writer.start_time,
|
|
315
|
+
now,
|
|
316
|
+
))
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/// The header of a new generation laid out as `config` says, with its row-epoch seed and
|
|
320
|
+
/// flags.
|
|
321
|
+
fn new_header(
|
|
322
|
+
db_id: [u8; 16],
|
|
323
|
+
config: &ShmConfig,
|
|
324
|
+
identity: FileIdentity,
|
|
325
|
+
generation: Generation,
|
|
326
|
+
writer: ProcessId,
|
|
327
|
+
) -> ShmHeader {
|
|
328
|
+
let mut h = ShmHeader::layout(
|
|
329
|
+
db_id,
|
|
330
|
+
config.shards,
|
|
331
|
+
config.reader_slots,
|
|
332
|
+
config.view_buffer_bytes,
|
|
333
|
+
config.arena_bytes,
|
|
334
|
+
config.row_epoch_slots,
|
|
335
|
+
identity.device,
|
|
336
|
+
identity.inode,
|
|
337
|
+
);
|
|
338
|
+
h.row_epoch_seed = row_epoch_seed(generation, writer);
|
|
339
|
+
if config.row_epochs_maintained {
|
|
340
|
+
h.row_epoch_flags |= pigeonhole_format::shm::ROW_EPOCHS_MAINTAINED;
|
|
341
|
+
}
|
|
342
|
+
h
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// Writes the header, including the fields `ShmHeader` leaves to this crate, idles every
|
|
346
|
+
/// watermark, then marks the region `ready`.
|
|
347
|
+
fn init_region(
|
|
348
|
+
region: &SharedRegion,
|
|
349
|
+
h: &ShmHeader,
|
|
350
|
+
generation: Generation,
|
|
351
|
+
writer: ProcessId,
|
|
352
|
+
first_seqno: Seqno,
|
|
353
|
+
) {
|
|
354
|
+
let mut page = [0u8; HEADER_LEN];
|
|
355
|
+
h.encode(&mut page);
|
|
356
|
+
page[header::GENERATION..header::GENERATION + 8].copy_from_slice(&generation.0.to_le_bytes());
|
|
357
|
+
page[header::WRITER_PID..header::WRITER_PID + 4].copy_from_slice(&writer.pid.to_le_bytes());
|
|
358
|
+
page[header::WRITER_START_TIME..header::WRITER_START_TIME + 8]
|
|
359
|
+
.copy_from_slice(&writer.start_time.to_le_bytes());
|
|
360
|
+
page[header::NEXT_SEQNO..header::NEXT_SEQNO + 8]
|
|
361
|
+
.copy_from_slice(&first_seqno.max(1).to_le_bytes());
|
|
362
|
+
page[header::CROSS_HELD..header::CROSS_HELD + 8].copy_from_slice(&u64::MAX.to_le_bytes());
|
|
363
|
+
region.write(0, &page);
|
|
364
|
+
for shard in 0..h.shard_count {
|
|
365
|
+
let off = h.watermarks_off as usize + WATERMARK_STRIDE * shard as usize;
|
|
366
|
+
for field in [
|
|
367
|
+
watermark::PENDING,
|
|
368
|
+
watermark::DURABLE,
|
|
369
|
+
watermark::WRITTEN,
|
|
370
|
+
watermark::SYNCED,
|
|
371
|
+
] {
|
|
372
|
+
region
|
|
373
|
+
.atomic_u64(off + field)
|
|
374
|
+
.store(u64::MAX, Ordering::Relaxed);
|
|
375
|
+
}
|
|
376
|
+
// The change feed's marks start unknown (layout version 8).
|
|
377
|
+
for field in [
|
|
378
|
+
watermark::FEED_FLOOR,
|
|
379
|
+
watermark::FEED_CKPT,
|
|
380
|
+
watermark::FEED_BOUND,
|
|
381
|
+
] {
|
|
382
|
+
region.atomic_u64(off + field).store(0, Ordering::Relaxed);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
region
|
|
386
|
+
.atomic_u32(header::STATE)
|
|
387
|
+
.store(STATE_READY, Ordering::Release);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/// Attaches to the directory region, creating and initializing it if absent. The caller
|
|
391
|
+
/// holds the shm-init lock, so a zero magic (just created, or left by a creator that died
|
|
392
|
+
/// before writing it) is safe to initialize here.
|
|
393
|
+
fn open_directory(
|
|
394
|
+
vfs: &VfsRef,
|
|
395
|
+
identity: FileIdentity,
|
|
396
|
+
dir: Option<&Path>,
|
|
397
|
+
) -> Result<SharedRegion> {
|
|
398
|
+
let name = directory_name(identity.device, identity.inode);
|
|
399
|
+
let len = directory::LEN as u64;
|
|
400
|
+
let region = match vfs.open_shared(&name, dir, len, SharedOpen::Attach) {
|
|
401
|
+
Ok(r) => r,
|
|
402
|
+
Err(e) if e.kind == ErrorKind::NotFound => {
|
|
403
|
+
match vfs.open_shared(&name, dir, len, SharedOpen::CreateNew) {
|
|
404
|
+
Ok(r) => r,
|
|
405
|
+
Err(e) if e.kind == ErrorKind::AlreadyExists => {
|
|
406
|
+
vfs.open_shared(&name, dir, len, SharedOpen::Attach)?
|
|
407
|
+
}
|
|
408
|
+
Err(e) => return Err(unavailable(e)),
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
Err(e) => return Err(e.into()),
|
|
412
|
+
};
|
|
413
|
+
let mut magic = [0u8; 8];
|
|
414
|
+
region.read(directory::MAGIC, &mut magic);
|
|
415
|
+
if magic == [0u8; 8] {
|
|
416
|
+
region.write(directory::FORMAT, &DIRECTORY_FORMAT.to_le_bytes());
|
|
417
|
+
region.write(directory::MAGIC, &DIRECTORY_MAGIC);
|
|
418
|
+
} else if magic != DIRECTORY_MAGIC {
|
|
419
|
+
return Err(Error::Corrupt("shared-memory directory magic"));
|
|
420
|
+
}
|
|
421
|
+
let mut format = [0u8; 4];
|
|
422
|
+
region.read(directory::FORMAT, &mut format);
|
|
423
|
+
if u32::from_le_bytes(format) != DIRECTORY_FORMAT {
|
|
424
|
+
return Err(Error::Corrupt("shared-memory directory format"));
|
|
425
|
+
}
|
|
426
|
+
Ok(region)
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/// The database id in the header of `region` (mapped for at least [`HEADER_LEN`] bytes).
|
|
430
|
+
fn region_db_id(region: &SharedRegion) -> [u8; 16] {
|
|
431
|
+
let mut id = [0u8; 16];
|
|
432
|
+
region.read(header::DB_ID, &mut id);
|
|
433
|
+
id
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/// Reads and validates the header of `region` (mapped for at least [`HEADER_LEN`] bytes).
|
|
437
|
+
fn read_header(
|
|
438
|
+
region: &SharedRegion,
|
|
439
|
+
db_id: [u8; 16],
|
|
440
|
+
identity: FileIdentity,
|
|
441
|
+
generation: Generation,
|
|
442
|
+
) -> Result<ShmHeader> {
|
|
443
|
+
let mut page = [0u8; HEADER_LEN];
|
|
444
|
+
region.read(0, &mut page);
|
|
445
|
+
let h = ShmHeader::decode(&page)?;
|
|
446
|
+
let found = u64::from_le_bytes(
|
|
447
|
+
page[header::GENERATION..header::GENERATION + 8]
|
|
448
|
+
.try_into()
|
|
449
|
+
.expect("8 bytes"),
|
|
450
|
+
);
|
|
451
|
+
if found != generation.0 {
|
|
452
|
+
return Err(Error::Corrupt("region generation does not match its name"));
|
|
453
|
+
}
|
|
454
|
+
if h.db_id != db_id {
|
|
455
|
+
// Left by another database whose file had this file's (device, inode): the inode was
|
|
456
|
+
// reused after that file was deleted (#1133). No writer of this database has built a
|
|
457
|
+
// region yet.
|
|
458
|
+
return Err(Error::NoWriter);
|
|
459
|
+
}
|
|
460
|
+
if h.file_device != identity.device || h.file_inode != identity.inode {
|
|
461
|
+
return Err(Error::Corrupt("region belongs to another file"));
|
|
462
|
+
}
|
|
463
|
+
Ok(h)
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/// Attaches to generation `generation` named by the directory (reader open and re-attach).
|
|
467
|
+
fn attach(
|
|
468
|
+
vfs: &VfsRef,
|
|
469
|
+
directory: SharedRegion,
|
|
470
|
+
identity: FileIdentity,
|
|
471
|
+
db_id: [u8; 16],
|
|
472
|
+
config: &ShmConfig,
|
|
473
|
+
generation: Generation,
|
|
474
|
+
) -> Result<Inner> {
|
|
475
|
+
if generation.0 == 0 {
|
|
476
|
+
// No writer has built a region (or the last one removed the directory's generation).
|
|
477
|
+
return Err(Error::NoWriter);
|
|
478
|
+
}
|
|
479
|
+
let found = directory
|
|
480
|
+
.atomic_u32(directory::LAYOUT_VERSION)
|
|
481
|
+
.load(Ordering::Acquire);
|
|
482
|
+
if found != ShmLayoutVersion::CURRENT.0 {
|
|
483
|
+
return Err(Error::VersionMismatch {
|
|
484
|
+
found,
|
|
485
|
+
expected: ShmLayoutVersion::CURRENT.0,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
let dir = config.dir.as_deref();
|
|
489
|
+
let name = region_name(identity.device, identity.inode, generation.0);
|
|
490
|
+
// The generation the directory names may be gone: its writer closed and no process
|
|
491
|
+
// maps it (on Windows a mapping disappears with its last handle, #844). Only that is
|
|
492
|
+
// `NoWriter`; any other failure stays an I/O error.
|
|
493
|
+
let no_writer = |e: pigeonhole_io::Error| match e.kind {
|
|
494
|
+
ErrorKind::NotFound => Error::NoWriter,
|
|
495
|
+
_ => Error::Io(e),
|
|
496
|
+
};
|
|
497
|
+
let probe = vfs
|
|
498
|
+
.open_shared(&name, dir, HEADER_LEN as u64, SharedOpen::Attach)
|
|
499
|
+
.map_err(no_writer)?;
|
|
500
|
+
let h = read_header(&probe, db_id, identity, generation)?;
|
|
501
|
+
let len = usize::try_from(h.region_len).map_err(|_| Error::Corrupt("region length"))?;
|
|
502
|
+
let region = if probe.len() >= len {
|
|
503
|
+
probe
|
|
504
|
+
} else {
|
|
505
|
+
vfs.open_shared(&name, dir, h.region_len, SharedOpen::Attach)
|
|
506
|
+
.map_err(no_writer)?
|
|
507
|
+
};
|
|
508
|
+
let state = region.atomic_u32(header::STATE);
|
|
509
|
+
let mut waited = 0;
|
|
510
|
+
loop {
|
|
511
|
+
match state.load(Ordering::Acquire) {
|
|
512
|
+
STATE_READY => break,
|
|
513
|
+
STATE_ABANDONED => return Err(Error::Stale),
|
|
514
|
+
STATE_INITIALIZING if waited < READY_WAIT_ATTEMPTS => {
|
|
515
|
+
waited += 1;
|
|
516
|
+
std::thread::sleep(READY_WAIT_DELAY);
|
|
517
|
+
}
|
|
518
|
+
STATE_INITIALIZING => return Err(Error::Corrupt("region never became ready")),
|
|
519
|
+
_ => return Err(Error::Corrupt("region state")),
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
Ok(Inner {
|
|
523
|
+
region,
|
|
524
|
+
directory: Some(directory),
|
|
525
|
+
header: h,
|
|
526
|
+
generation,
|
|
527
|
+
db_id,
|
|
528
|
+
identity,
|
|
529
|
+
config: config.clone(),
|
|
530
|
+
publish_lock: Mutex::new(Vec::new()),
|
|
531
|
+
})
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/// Builds a new generation (writer open): creates and initializes the new region, marks the
|
|
535
|
+
/// old one abandoned, records the new generation in the directory, and removes the old name.
|
|
536
|
+
fn build(
|
|
537
|
+
vfs: &VfsRef,
|
|
538
|
+
file: &FileRef,
|
|
539
|
+
directory: SharedRegion,
|
|
540
|
+
identity: FileIdentity,
|
|
541
|
+
db_id: [u8; 16],
|
|
542
|
+
config: &ShmConfig,
|
|
543
|
+
current: u64,
|
|
544
|
+
) -> Result<Inner> {
|
|
545
|
+
let dir = config.dir.as_deref();
|
|
546
|
+
let mut current = current;
|
|
547
|
+
let mut old = if current == 0 {
|
|
548
|
+
None
|
|
549
|
+
} else {
|
|
550
|
+
let name = region_name(identity.device, identity.inode, current);
|
|
551
|
+
unless_missing(vfs.open_shared(&name, dir, HEADER_LEN as u64, SharedOpen::Attach))?
|
|
552
|
+
};
|
|
553
|
+
if old.as_ref().is_some_and(|old| region_db_id(old) != db_id) {
|
|
554
|
+
// Left by another database whose file had this file's (device, inode): the inode was
|
|
555
|
+
// reused after that file was deleted, and an inode is not reused while any process
|
|
556
|
+
// has the file open, so nothing maps this region for its own database (#1133).
|
|
557
|
+
// Remove it and start this database at generation 1.
|
|
558
|
+
vfs.remove_shared(®ion_name(identity.device, identity.inode, current), dir)?;
|
|
559
|
+
current = 0;
|
|
560
|
+
old = None;
|
|
561
|
+
}
|
|
562
|
+
if let Some(old) = &old {
|
|
563
|
+
// A live region with another layout version is refused unless no other process has
|
|
564
|
+
// the database open (then nobody can be attached to it).
|
|
565
|
+
let found = old
|
|
566
|
+
.atomic_u32(header::LAYOUT_VERSION)
|
|
567
|
+
.load(Ordering::Acquire);
|
|
568
|
+
if found != ShmLayoutVersion::CURRENT.0 && !alone(file)? {
|
|
569
|
+
return Err(Error::VersionMismatch {
|
|
570
|
+
found,
|
|
571
|
+
expected: ShmLayoutVersion::CURRENT.0,
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
// Present before the new generation is published, so a closing process cannot pass
|
|
576
|
+
// `Presence::try_become_last` and remove it. After the probe above this is a no-op.
|
|
577
|
+
present(file)?;
|
|
578
|
+
|
|
579
|
+
let generation = Generation(
|
|
580
|
+
current
|
|
581
|
+
.checked_add(1)
|
|
582
|
+
.ok_or(Error::Corrupt("generation counter exhausted"))?,
|
|
583
|
+
);
|
|
584
|
+
let name = region_name(identity.device, identity.inode, generation.0);
|
|
585
|
+
if name.len() > MAX_REGION_NAME {
|
|
586
|
+
return Err(io_error(
|
|
587
|
+
ErrorKind::Other,
|
|
588
|
+
"shared-memory region name exceeds 30 bytes (31 with the leading `/`)",
|
|
589
|
+
));
|
|
590
|
+
}
|
|
591
|
+
let writer = vfs.current_process();
|
|
592
|
+
let h = new_header(db_id, config, identity, generation, writer);
|
|
593
|
+
let region = match vfs.open_shared(&name, dir, h.region_len, SharedOpen::CreateNew) {
|
|
594
|
+
Ok(r) => r,
|
|
595
|
+
Err(e) if e.kind == ErrorKind::AlreadyExists => {
|
|
596
|
+
// Left by a writer that died after creating it and before recording it in the
|
|
597
|
+
// directory, so no process can be attached to it: replace it.
|
|
598
|
+
vfs.remove_shared(&name, dir)?;
|
|
599
|
+
vfs.open_shared(&name, dir, h.region_len, SharedOpen::CreateNew)
|
|
600
|
+
.map_err(unavailable)?
|
|
601
|
+
}
|
|
602
|
+
Err(e) => return Err(unavailable(e)),
|
|
603
|
+
};
|
|
604
|
+
init_region(®ion, &h, generation, writer, config.first_seqno);
|
|
605
|
+
if let Some(old) = &old {
|
|
606
|
+
old.atomic_u32(header::STATE)
|
|
607
|
+
.store(STATE_ABANDONED, Ordering::Release);
|
|
608
|
+
}
|
|
609
|
+
directory
|
|
610
|
+
.atomic_u32(directory::LAYOUT_VERSION)
|
|
611
|
+
.store(ShmLayoutVersion::CURRENT.0, Ordering::Release);
|
|
612
|
+
directory
|
|
613
|
+
.atomic_u64(directory::GENERATION)
|
|
614
|
+
.store(generation.0, Ordering::Release);
|
|
615
|
+
if old.is_some() {
|
|
616
|
+
// Mappings other processes still hold stay valid; only the name goes.
|
|
617
|
+
let _ = vfs.remove_shared(®ion_name(identity.device, identity.inode, current), dir);
|
|
618
|
+
}
|
|
619
|
+
Ok(Inner {
|
|
620
|
+
region,
|
|
621
|
+
directory: Some(directory),
|
|
622
|
+
header: h,
|
|
623
|
+
generation,
|
|
624
|
+
db_id,
|
|
625
|
+
identity,
|
|
626
|
+
config: config.clone(),
|
|
627
|
+
publish_lock: Mutex::new(Vec::new()),
|
|
628
|
+
})
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
impl ShmRegion {
|
|
632
|
+
/// Creates or attaches to the region for the database file `identity`, holding the
|
|
633
|
+
/// shm-init lock byte on `file` while creating or validating. Finds the current
|
|
634
|
+
/// generation through the directory region (FORMAT §11). A writer always builds a new
|
|
635
|
+
/// generation: it creates the new region, marks the old one abandoned, then records the
|
|
636
|
+
/// new generation in the directory. Refuses a live region with another layout version
|
|
637
|
+
/// ([`Error::VersionMismatch`]) unless no other process is attached.
|
|
638
|
+
///
|
|
639
|
+
/// `file` must be opened for writing in both roles (the shm-init byte is an exclusive
|
|
640
|
+
/// lock).
|
|
641
|
+
///
|
|
642
|
+
/// **Writer call order:** [`WriterLock::acquire`](crate::WriterLock::acquire), then this,
|
|
643
|
+
/// then [`Presence::acquire`](crate::Presence::acquire) on the same handle (decision
|
|
644
|
+
/// D37). The writer role takes the presence byte shared itself, after the layout-version
|
|
645
|
+
/// probe and before it publishes the new generation, so a closing process can never
|
|
646
|
+
/// remove a generation being built; the later `Presence::acquire` only returns the
|
|
647
|
+
/// guard. Taking `Presence` first would make the probe upgrade a lock the writer must
|
|
648
|
+
/// keep, which Windows cannot do atomically. If this fails, the presence byte may stay
|
|
649
|
+
/// held until `file` is closed. A reader with no region to attach to (no writer has built one yet) gets
|
|
650
|
+
/// [`Error::NoWriter`], as does a reader that finds only a region left by another database
|
|
651
|
+
/// whose deleted file had this file's (device, inode); a writer removes such a region and
|
|
652
|
+
/// starts at generation 1 (#1133). A writer's new generation starts its seqno
|
|
653
|
+
/// counter at `config.first_seqno` (ICR 0002). `config` must pass
|
|
654
|
+
/// [`ShmConfig::validate`].
|
|
655
|
+
pub fn open(
|
|
656
|
+
vfs: &VfsRef,
|
|
657
|
+
file: &FileRef,
|
|
658
|
+
identity: FileIdentity,
|
|
659
|
+
db_id: [u8; 16],
|
|
660
|
+
role: Role,
|
|
661
|
+
config: &ShmConfig,
|
|
662
|
+
) -> Result<ShmRegion> {
|
|
663
|
+
config.validate()?;
|
|
664
|
+
let _init = ShmInit::acquire(file)?;
|
|
665
|
+
let directory = open_directory(vfs, identity, config.dir.as_deref())?;
|
|
666
|
+
let current = directory
|
|
667
|
+
.atomic_u64(directory::GENERATION)
|
|
668
|
+
.load(Ordering::Acquire);
|
|
669
|
+
let inner = match role {
|
|
670
|
+
Role::Reader => attach(vfs, directory, identity, db_id, config, Generation(current))?,
|
|
671
|
+
Role::Writer => build(vfs, file, directory, identity, db_id, config, current)?,
|
|
672
|
+
};
|
|
673
|
+
Ok(ShmRegion {
|
|
674
|
+
inner: Arc::new(inner),
|
|
675
|
+
})
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/// A private heap-backed region with the same layout (the mock for engine tests).
|
|
679
|
+
///
|
|
680
|
+
/// Generation 1, never stale; [`ShmRegion::reattach`] returns a clone. Panics if
|
|
681
|
+
/// `config` fails [`ShmConfig::validate`].
|
|
682
|
+
pub fn in_memory(db_id: [u8; 16], config: &ShmConfig) -> ShmRegion {
|
|
683
|
+
if let Err(e) = config.validate() {
|
|
684
|
+
panic!("{e}");
|
|
685
|
+
}
|
|
686
|
+
let identity = FileIdentity {
|
|
687
|
+
device: 0,
|
|
688
|
+
inode: 0,
|
|
689
|
+
};
|
|
690
|
+
let generation = Generation(1);
|
|
691
|
+
let writer = ProcessId {
|
|
692
|
+
pid: 0,
|
|
693
|
+
start_time: 0,
|
|
694
|
+
};
|
|
695
|
+
let h = new_header(db_id, config, identity, generation, writer);
|
|
696
|
+
let len = usize::try_from(h.region_len).expect("region fits in memory");
|
|
697
|
+
let region = SharedRegion::heap(len);
|
|
698
|
+
init_region(®ion, &h, generation, writer, config.first_seqno);
|
|
699
|
+
ShmRegion {
|
|
700
|
+
inner: Arc::new(Inner {
|
|
701
|
+
region,
|
|
702
|
+
directory: None,
|
|
703
|
+
header: h,
|
|
704
|
+
generation,
|
|
705
|
+
db_id,
|
|
706
|
+
identity,
|
|
707
|
+
config: config.clone(),
|
|
708
|
+
publish_lock: Mutex::new(Vec::new()),
|
|
709
|
+
}),
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/// Removes the region's and the directory's names (by the last process, after
|
|
714
|
+
/// [`Presence::try_become_last`](crate::Presence::try_become_last)). Mappings other
|
|
715
|
+
/// processes still hold stay valid. Nothing to remove is not an error.
|
|
716
|
+
pub fn remove(vfs: &VfsRef, identity: FileIdentity, dir: Option<&Path>) -> Result<()> {
|
|
717
|
+
let name = directory_name(identity.device, identity.inode);
|
|
718
|
+
let Some(directory) =
|
|
719
|
+
unless_missing(vfs.open_shared(&name, dir, directory::LEN as u64, SharedOpen::Attach))?
|
|
720
|
+
else {
|
|
721
|
+
return Ok(());
|
|
722
|
+
};
|
|
723
|
+
let mut magic = [0u8; 8];
|
|
724
|
+
directory.read(directory::MAGIC, &mut magic);
|
|
725
|
+
if magic == DIRECTORY_MAGIC {
|
|
726
|
+
let generation = directory
|
|
727
|
+
.atomic_u64(directory::GENERATION)
|
|
728
|
+
.load(Ordering::Acquire);
|
|
729
|
+
if generation != 0 {
|
|
730
|
+
let region = region_name(identity.device, identity.inode, generation);
|
|
731
|
+
unless_missing(vfs.remove_shared(®ion, dir))?;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
unless_missing(vfs.remove_shared(&name, dir))?;
|
|
735
|
+
Ok(())
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/// Whether a newer generation replaced this mapping (its state is abandoned or the
|
|
739
|
+
/// directory names another generation). Cheap: two atomic loads.
|
|
740
|
+
pub fn is_stale(&self) -> bool {
|
|
741
|
+
let Some(directory) = &self.inner.directory else {
|
|
742
|
+
return false;
|
|
743
|
+
};
|
|
744
|
+
self.inner.h32(header::STATE).load(Ordering::Acquire) != STATE_READY
|
|
745
|
+
|| directory
|
|
746
|
+
.atomic_u64(directory::GENERATION)
|
|
747
|
+
.load(Ordering::Acquire)
|
|
748
|
+
!= self.inner.generation.0
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/// Attaches to the current generation (reader processes, after [`ShmRegion::is_stale`]).
|
|
752
|
+
/// The caller re-claims its reader slot and re-pins in the new region.
|
|
753
|
+
pub fn reattach(&self, vfs: &VfsRef, file: &FileRef) -> Result<ShmRegion> {
|
|
754
|
+
if self.inner.directory.is_none() {
|
|
755
|
+
return Ok(self.clone());
|
|
756
|
+
}
|
|
757
|
+
ShmRegion::open(
|
|
758
|
+
vfs,
|
|
759
|
+
file,
|
|
760
|
+
self.inner.identity,
|
|
761
|
+
self.inner.db_id,
|
|
762
|
+
Role::Reader,
|
|
763
|
+
&self.inner.config,
|
|
764
|
+
)
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/// This generation's row-epoch table (D281): the write watermarks of every process's row
|
|
768
|
+
/// cache, with the seed of the hash that picks a row's slot. Both come from this region's
|
|
769
|
+
/// header, validated at attach, so a reader never pairs one generation's seed with
|
|
770
|
+
/// another's table.
|
|
771
|
+
pub fn row_epochs(&self) -> RowEpochTable {
|
|
772
|
+
let h = &self.inner.header;
|
|
773
|
+
RowEpochTable {
|
|
774
|
+
region: self.inner.region.clone(),
|
|
775
|
+
off: h.row_epochs_off as usize,
|
|
776
|
+
mask: u64::from(h.row_epoch_slots) - 1,
|
|
777
|
+
seed: h.row_epoch_seed,
|
|
778
|
+
maintained: h.row_epoch_flags & pigeonhole_format::shm::ROW_EPOCHS_MAINTAINED != 0,
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/// Current generation.
|
|
783
|
+
pub fn generation(&self) -> Generation {
|
|
784
|
+
self.inner.generation
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/// Shard count of the region's layout.
|
|
788
|
+
pub fn shard_count(&self) -> u32 {
|
|
789
|
+
self.inner.header.shard_count
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/// The underlying mapping and the `(offset, len)` of `shard`'s arena within it, for
|
|
793
|
+
/// `pigeonhole_memtable::ArenaRegion::new`. Panics if `shard` is out of range.
|
|
794
|
+
pub fn arena(&self, shard: u32) -> (SharedRegion, usize, usize) {
|
|
795
|
+
let h = &self.inner.header;
|
|
796
|
+
assert!(
|
|
797
|
+
shard < h.shard_count,
|
|
798
|
+
"shard {shard} out of range (region has {} shards)",
|
|
799
|
+
h.shard_count
|
|
800
|
+
);
|
|
801
|
+
let len = h.arena_len as usize;
|
|
802
|
+
let offset = h.arenas_off as usize + len * shard as usize;
|
|
803
|
+
(self.inner.region.clone(), offset, len)
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/// The `(offset, len)` of every arena together: the region's tail, from the first
|
|
807
|
+
/// arena's start to the end.
|
|
808
|
+
fn arenas_range(&self) -> (usize, usize) {
|
|
809
|
+
let h = &self.inner.header;
|
|
810
|
+
(
|
|
811
|
+
h.arenas_off as usize,
|
|
812
|
+
h.arena_len as usize * h.shard_count as usize,
|
|
813
|
+
)
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/// Frees the memory of every arena ([`SharedRegion::discard`]): the header, the
|
|
817
|
+
/// watermarks, the view buffers and the reader slots stay intact, so the region's
|
|
818
|
+
/// protocol keeps working, and a later read of an arena sees zeros. For a writer
|
|
819
|
+
/// releasing a closed instance's memory (D265), once no one still reads the arenas as
|
|
820
|
+
/// data: in this process, no view that lists a memtable lives; in other processes,
|
|
821
|
+
/// none can take the region for current ([`ShmRegion::is_superseded`]), so a reader
|
|
822
|
+
/// still attached fails its reads with the engine's `SnapshotExpired` after reading
|
|
823
|
+
/// them, and `pigeonhole-memtable`'s reader never faults on zeroed pages. That a reader
|
|
824
|
+
/// which saw a zero also sees the new generation is the kernel's doing, not the memory
|
|
825
|
+
/// model's: the writer stores the new generation in the directory (Release) before the
|
|
826
|
+
/// `madvise`, which zaps every process's page-table entries for the range and waits for
|
|
827
|
+
/// the TLB shootdowns before it returns, so a reader sees zeros only by faulting after
|
|
828
|
+
/// that, and the fault and the shootdown's interrupt are full barriers ahead of its
|
|
829
|
+
/// `Acquire` fence and directory load. Linux only: an error elsewhere
|
|
830
|
+
/// ([`pigeonhole_io::ErrorKind::Unsupported`] on macOS and Windows, `EOPNOTSUPP` from a
|
|
831
|
+
/// `shm_dir` file system without hole punching), and nothing is freed.
|
|
832
|
+
pub fn discard_arenas(&self) -> Result<()> {
|
|
833
|
+
let (offset, len) = self.arenas_range();
|
|
834
|
+
Ok(self.inner.region.discard(offset, len)?)
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/// How many bytes of the arenas are resident in memory
|
|
838
|
+
/// ([`SharedRegion::resident_bytes`]; Linux mappings only). A test probe for
|
|
839
|
+
/// [`ShmRegion::discard_arenas`].
|
|
840
|
+
pub fn arena_resident_bytes(&self) -> Result<usize> {
|
|
841
|
+
let (offset, len) = self.arenas_range();
|
|
842
|
+
Ok(self.inner.region.resident_bytes(offset, len)?)
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/// Whether no reader process can take this mapping for the current generation: an
|
|
846
|
+
/// in-memory region (no other process can attach to it), or a mapping a newer
|
|
847
|
+
/// generation replaced ([`ShmRegion::is_stale`]). A reader attached to such a region
|
|
848
|
+
/// fails its reads with `SnapshotExpired` and re-attaches (D148).
|
|
849
|
+
pub fn is_superseded(&self) -> bool {
|
|
850
|
+
self.inner.directory.is_none() || self.is_stale()
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// ---- seqnos and watermarks ----
|
|
854
|
+
|
|
855
|
+
/// Raises the next seqno to reserve to at least `to` (`fetch_max`, release ordering): the
|
|
856
|
+
/// mirror of a writer that reserves seqnos in its own process (D271, ICR 0063). It never
|
|
857
|
+
/// moves past a reservation the writer made, and the writer published its pending
|
|
858
|
+
/// watermark before reserving, so a reader that sees the mirror at `to` sees that
|
|
859
|
+
/// watermark too (`FORMAT.md` §11.3).
|
|
860
|
+
pub fn advance_next_seqno(&self, to: Seqno) {
|
|
861
|
+
self.inner
|
|
862
|
+
.h64(header::NEXT_SEQNO)
|
|
863
|
+
.fetch_max(to, Ordering::AcqRel);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
/// Publishes `shard`'s pending watermark with release ordering: the lowest seqno it holds
|
|
867
|
+
/// unapplied; `u64::MAX` when it holds nothing, so an idle shard never holds back
|
|
868
|
+
/// snapshots. A new group's hold is stored under the writer's allocator lock, before
|
|
869
|
+
/// [`ShmRegion::advance_next_seqno`] passes it (FORMAT §11.3, D300): stored any later, or
|
|
870
|
+
/// as a bound read from [`ShmRegion::next_seqno`], it could land below a seqno readers
|
|
871
|
+
/// already see, and the visible seqno would go back (#1208).
|
|
872
|
+
pub fn publish_pending(&self, shard: u32, pending: Seqno) {
|
|
873
|
+
self.inner.pending(shard).store(pending, Ordering::Release);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/// Publishes the lowest decided cross-shard seqno not yet applied on every participant
|
|
877
|
+
/// (layout version 6, D278), with release ordering; `u64::MAX` when none. Snapshots stay
|
|
878
|
+
/// below it. One writer at a time: the writer process's allocator stores it under its
|
|
879
|
+
/// lock, before the `NEXT_SEQNO` mirror passes a new decision's seqno.
|
|
880
|
+
pub fn publish_cross_held(&self, held: Seqno) {
|
|
881
|
+
self.inner
|
|
882
|
+
.h64(header::CROSS_HELD)
|
|
883
|
+
.store(held, Ordering::Release);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/// The highest seqno a new snapshot may include: every commit at or below it is applied
|
|
887
|
+
/// on every shard: the minimum of `NEXT_SEQNO`, the cross-shard hold (`CROSS_HELD`, D278)
|
|
888
|
+
/// and every shard's pending watermark, so one Acquire load per shard plus two. Always
|
|
889
|
+
/// inlined: left to the linker it was outlined into a call on the point-get path (12
|
|
890
|
+
/// instructions, #836 round 6).
|
|
891
|
+
#[inline(always)]
|
|
892
|
+
pub fn visible_seqno(&self) -> Seqno {
|
|
893
|
+
self.inner.visible_seqno()
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
/// Publishes `shard`'s durable watermark with release ordering (D227): the lowest seqno
|
|
897
|
+
/// it holds that is not yet durable at its commit's level (never above its pending
|
|
898
|
+
/// watermark); `u64::MAX` when it holds nothing.
|
|
899
|
+
pub fn publish_durable(&self, shard: u32, durable: Seqno) {
|
|
900
|
+
self.inner.durable(shard).store(durable, Ordering::Release);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
/// Publishes `shard`'s written watermark with release ordering (layout version 7, D310):
|
|
904
|
+
/// the lowest seqno it holds whose record the change feed needs and that is not yet in
|
|
905
|
+
/// its stream file; `u64::MAX` when none. Store it before
|
|
906
|
+
/// [`publish_pending`](Self::publish_pending) releases the seqno (FORMAT §11.2).
|
|
907
|
+
pub fn publish_written(&self, shard: u32, written: Seqno) {
|
|
908
|
+
self.inner.written(shard).store(written, Ordering::Release);
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
/// Publishes `shard`'s synced watermark with release ordering (layout version 7, D310):
|
|
912
|
+
/// as [`publish_written`](Self::publish_written), for the records the change feed needs
|
|
913
|
+
/// that are not yet synced; `u64::MAX` when none.
|
|
914
|
+
pub fn publish_synced(&self, shard: u32, synced: Seqno) {
|
|
915
|
+
self.inner.synced(shard).store(synced, Ordering::Release);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/// Raises `shard`'s stream's feed floor (the smallest epoch not yet recyclable) with
|
|
919
|
+
/// release ordering; it never goes down.
|
|
920
|
+
pub fn publish_feed_floor(&self, shard: u32, epoch: u32) {
|
|
921
|
+
self.inner
|
|
922
|
+
.feed_mark(shard, watermark::FEED_FLOOR)
|
|
923
|
+
.fetch_max(u64::from(epoch), Ordering::AcqRel);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/// Raises `shard`'s stream's checkpoint for change feeds (an `Lsn`'s raw value) with
|
|
927
|
+
/// release ordering, once the checkpoint edit is durable; it never goes down.
|
|
928
|
+
pub fn publish_feed_checkpoint(&self, shard: u32, lsn: u64) {
|
|
929
|
+
self.inner
|
|
930
|
+
.feed_mark(shard, watermark::FEED_CKPT)
|
|
931
|
+
.fetch_max(lsn, Ordering::AcqRel);
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
/// Raises `shard`'s stream's lost bound (layout version 8, `watermark::FEED_BOUND`) with
|
|
935
|
+
/// release ordering; it never goes down. The writer stores it before the floor it
|
|
936
|
+
/// belongs to.
|
|
937
|
+
pub fn publish_feed_bound(&self, shard: u32, bound: u64) {
|
|
938
|
+
self.inner
|
|
939
|
+
.feed_mark(shard, watermark::FEED_BOUND)
|
|
940
|
+
.fetch_max(bound, Ordering::AcqRel);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
/// `shard`'s stream's change-feed marks (layout version 8, Acquire each, in this order):
|
|
944
|
+
/// the floor epoch, the checkpoint `Lsn`'s raw value, and the lost bound (loaded after the
|
|
945
|
+
/// floor, so it is at least that floor's); zeros until a writer with the feed on stores
|
|
946
|
+
/// them.
|
|
947
|
+
pub fn feed_marks(&self, shard: u32) -> FeedMarksView {
|
|
948
|
+
let load = |f| self.inner.feed_mark(shard, f).load(Ordering::Acquire);
|
|
949
|
+
let floor = load(watermark::FEED_FLOOR) as u32;
|
|
950
|
+
let checkpoint = load(watermark::FEED_CKPT);
|
|
951
|
+
let bound = load(watermark::FEED_BOUND);
|
|
952
|
+
FeedMarksView {
|
|
953
|
+
floor,
|
|
954
|
+
checkpoint,
|
|
955
|
+
bound,
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/// The change feed's frontier (D310): every commit at or below it is applied on every
|
|
960
|
+
/// shard and its records are in their stream files; with `durable`, it is durable at its
|
|
961
|
+
/// level and the records the feed needs are synced, so no crash undoes it. Never above [`ShmRegion::visible_seqno`].
|
|
962
|
+
pub fn written_seqno(&self, durable: bool) -> Seqno {
|
|
963
|
+
self.inner.written_seqno(durable)
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
/// The highest seqno a durable snapshot may include (D227, ICR 0037): every commit at or
|
|
967
|
+
/// below it is applied on every shard and durable at its level. Never above
|
|
968
|
+
/// [`ShmRegion::visible_seqno`].
|
|
969
|
+
pub fn durable_seqno(&self) -> Seqno {
|
|
970
|
+
self.inner.durable_seqno()
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
/// The mirror of the next seqno the writer will reserve ([`ShmRegion::advance_next_seqno`];
|
|
974
|
+
/// acquire load). It never runs ahead of the writer's reservations. Snapshots load it
|
|
975
|
+
/// first (FORMAT §11.3).
|
|
976
|
+
pub fn next_seqno(&self) -> Seqno {
|
|
977
|
+
self.inner.h64(header::NEXT_SEQNO).load(Ordering::Acquire)
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
// ---- views and manifest ----
|
|
981
|
+
|
|
982
|
+
/// Publishes a view (writer only): writes the inactive buffer, then swaps the view
|
|
983
|
+
/// pointer with release ordering. Fails with [`Error::ViewTooLarge`] (publishing nothing)
|
|
984
|
+
/// if the encoded view exceeds the buffer.
|
|
985
|
+
///
|
|
986
|
+
/// `view.view_version` becomes the published version and must be greater than the
|
|
987
|
+
/// published one ([`Error::ViewVersionNotNewer`] otherwise; readers pin by version, and 0
|
|
988
|
+
/// means "no view"). There is one publisher: the writer process (its lock excludes
|
|
989
|
+
/// others), and within it a mutex serializes callers, so a second thread publishing
|
|
990
|
+
/// concurrently waits rather than racing on the inactive buffer.
|
|
991
|
+
pub fn publish_view(&self, view: &ViewRecord) -> Result<()> {
|
|
992
|
+
let mut bytes = self
|
|
993
|
+
.inner
|
|
994
|
+
.publish_lock
|
|
995
|
+
.lock()
|
|
996
|
+
.unwrap_or_else(PoisonError::into_inner);
|
|
997
|
+
let current = self.inner.view_pointer(Ordering::Relaxed);
|
|
998
|
+
let published = current >> 1;
|
|
999
|
+
if view.view_version <= published {
|
|
1000
|
+
return Err(Error::ViewVersionNotNewer {
|
|
1001
|
+
published,
|
|
1002
|
+
offered: view.view_version,
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
1005
|
+
let capacity = self.inner.header.view_buffer_len as usize;
|
|
1006
|
+
let needed = view.encoded_len();
|
|
1007
|
+
if needed > capacity {
|
|
1008
|
+
return Err(Error::ViewTooLarge { needed, capacity });
|
|
1009
|
+
}
|
|
1010
|
+
bytes.clear();
|
|
1011
|
+
bytes.reserve(needed);
|
|
1012
|
+
view.encode(&mut bytes);
|
|
1013
|
+
let index = if current == 0 { 0 } else { (current & 1) ^ 1 };
|
|
1014
|
+
self.inner.region.write(
|
|
1015
|
+
self.inner.header.views_off as usize + index as usize * capacity,
|
|
1016
|
+
&bytes,
|
|
1017
|
+
);
|
|
1018
|
+
// SeqCst, not just Release: it pairs with the SeqCst stores in `ReaderSlot::pin`, so
|
|
1019
|
+
// the writer scanning slots after publishing and a reader re-checking the pointer
|
|
1020
|
+
// after pinning cannot both miss each other.
|
|
1021
|
+
self.inner
|
|
1022
|
+
.h64(header::VIEW_POINTER)
|
|
1023
|
+
.store((view.view_version << 1) | index, Ordering::SeqCst);
|
|
1024
|
+
Ok(())
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/// Copies and decodes the current view, retrying if the writer swapped buffers mid-copy.
|
|
1028
|
+
///
|
|
1029
|
+
/// Before any view is published, returns an empty record with `view_version` 0 and the
|
|
1030
|
+
/// current manifest version.
|
|
1031
|
+
pub fn read_view(&self) -> Result<ViewRecord> {
|
|
1032
|
+
let inner = &self.inner;
|
|
1033
|
+
let capacity = inner.header.view_buffer_len as usize;
|
|
1034
|
+
let mut bad_copies = 0;
|
|
1035
|
+
loop {
|
|
1036
|
+
let pointer = inner.view_pointer(Ordering::Acquire);
|
|
1037
|
+
if pointer == 0 {
|
|
1038
|
+
return Ok(ViewRecord {
|
|
1039
|
+
view_version: 0,
|
|
1040
|
+
manifest_version: self.manifest_version(),
|
|
1041
|
+
..ViewRecord::default()
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
let base = inner.header.views_off as usize + (pointer & 1) as usize * capacity;
|
|
1045
|
+
let mut head = [0u8; VIEW_HEADER_LEN];
|
|
1046
|
+
inner.region.read(base, &mut head);
|
|
1047
|
+
let byte_len = u32::from_le_bytes(head[16..20].try_into().expect("4 bytes")) as usize;
|
|
1048
|
+
let decoded = if (VIEW_HEADER_LEN..=capacity).contains(&byte_len) {
|
|
1049
|
+
let mut record = vec![0u8; byte_len];
|
|
1050
|
+
record[..VIEW_HEADER_LEN].copy_from_slice(&head);
|
|
1051
|
+
inner
|
|
1052
|
+
.region
|
|
1053
|
+
.read(base + VIEW_HEADER_LEN, &mut record[VIEW_HEADER_LEN..]);
|
|
1054
|
+
ViewRecord::decode(&record)
|
|
1055
|
+
.ok()
|
|
1056
|
+
.filter(|v| v.view_version == pointer >> 1)
|
|
1057
|
+
} else {
|
|
1058
|
+
None
|
|
1059
|
+
};
|
|
1060
|
+
if inner.view_pointer(Ordering::Acquire) != pointer {
|
|
1061
|
+
// Swapped under us: the copy may mix two views. Start over.
|
|
1062
|
+
bad_copies = 0;
|
|
1063
|
+
continue;
|
|
1064
|
+
}
|
|
1065
|
+
match decoded {
|
|
1066
|
+
Some(view) => return Ok(view),
|
|
1067
|
+
None => {
|
|
1068
|
+
// The pointer did not move, so the writer was not touching this buffer.
|
|
1069
|
+
bad_copies += 1;
|
|
1070
|
+
if bad_copies >= VIEW_READ_ATTEMPTS {
|
|
1071
|
+
return Err(Error::Corrupt("view record checksum"));
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
/// Current view version, without copying the view.
|
|
1079
|
+
pub fn view_version(&self) -> u64 {
|
|
1080
|
+
self.inner.view_pointer(Ordering::Acquire) >> 1
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
/// Records the manifest version readers should load.
|
|
1084
|
+
pub fn set_manifest_version(&self, version: ManifestVersion) {
|
|
1085
|
+
self.inner
|
|
1086
|
+
.h64(header::MANIFEST_VERSION)
|
|
1087
|
+
.store(version, Ordering::Release);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/// The manifest version readers should load.
|
|
1091
|
+
pub fn manifest_version(&self) -> ManifestVersion {
|
|
1092
|
+
self.inner
|
|
1093
|
+
.h64(header::MANIFEST_VERSION)
|
|
1094
|
+
.load(Ordering::Acquire)
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
// ---- reader slots ----
|
|
1098
|
+
|
|
1099
|
+
/// Claims a free reader slot for `process` and takes its liveness lock through `file`,
|
|
1100
|
+
/// the reader's handle on the database file (layout 3, #693 PR 3): byte
|
|
1101
|
+
/// [`READER_LOCK_BASE`] `+ index`, exclusive, taken **before** the slot's `free ->
|
|
1102
|
+
/// claiming` CAS and held until the slot is freed. The writer frees a slot only once it
|
|
1103
|
+
/// can take that byte itself ([`ShmRegion::reclaim_dead_slots_locked`]), so a live
|
|
1104
|
+
/// reader is never judged dead (whatever its pid namespace), and a claimer that died
|
|
1105
|
+
/// between its CAS and its `active` store is reclaimed too. A byte another handle holds
|
|
1106
|
+
/// is skipped: a reader that died with its slot still `active` until the writer frees it.
|
|
1107
|
+
pub fn claim_reader_slot_locked(
|
|
1108
|
+
&self,
|
|
1109
|
+
process: ProcessId,
|
|
1110
|
+
file: &FileRef,
|
|
1111
|
+
) -> Result<ReaderSlot> {
|
|
1112
|
+
let inner = &self.inner;
|
|
1113
|
+
for index in 0..inner.header.reader_slot_count {
|
|
1114
|
+
let byte = READER_LOCK_BASE + u64::from(index);
|
|
1115
|
+
// A byte this handle already holds is another live slot's (locks never conflict
|
|
1116
|
+
// within a handle, so locking it would succeed, and the failure path below would
|
|
1117
|
+
// release it under that slot): taken, like a byte another handle holds
|
|
1118
|
+
// (perf287's review of #898, S2).
|
|
1119
|
+
if file.holds(byte).is_some() {
|
|
1120
|
+
continue;
|
|
1121
|
+
}
|
|
1122
|
+
match file.lock(byte, LockMode::Exclusive) {
|
|
1123
|
+
Ok(()) => {}
|
|
1124
|
+
Err(e) if e.kind == ErrorKind::Locked => continue,
|
|
1125
|
+
Err(e) => return Err(e.into()),
|
|
1126
|
+
}
|
|
1127
|
+
let state = inner.slot32(index, reader_slot::STATE);
|
|
1128
|
+
if state
|
|
1129
|
+
.compare_exchange(
|
|
1130
|
+
SLOT_FREE,
|
|
1131
|
+
SLOT_CLAIMING,
|
|
1132
|
+
Ordering::AcqRel,
|
|
1133
|
+
Ordering::Relaxed,
|
|
1134
|
+
)
|
|
1135
|
+
.is_err()
|
|
1136
|
+
{
|
|
1137
|
+
let _ = file.unlock(byte);
|
|
1138
|
+
continue;
|
|
1139
|
+
}
|
|
1140
|
+
inner
|
|
1141
|
+
.slot32(index, reader_slot::PID)
|
|
1142
|
+
.store(process.pid, Ordering::Relaxed);
|
|
1143
|
+
inner
|
|
1144
|
+
.slot64(index, reader_slot::START_TIME)
|
|
1145
|
+
.store(process.start_time, Ordering::Relaxed);
|
|
1146
|
+
inner
|
|
1147
|
+
.slot64(index, reader_slot::PINNED_SEQNO)
|
|
1148
|
+
.store(0, Ordering::Relaxed);
|
|
1149
|
+
inner
|
|
1150
|
+
.slot64(index, reader_slot::PINNED_VIEW)
|
|
1151
|
+
.store(0, Ordering::Relaxed);
|
|
1152
|
+
inner
|
|
1153
|
+
.slot64(index, reader_slot::GENERATION)
|
|
1154
|
+
.store(inner.generation.0, Ordering::Relaxed);
|
|
1155
|
+
state.store(SLOT_ACTIVE, Ordering::Release);
|
|
1156
|
+
return Ok(ReaderSlot {
|
|
1157
|
+
region: inner.clone(),
|
|
1158
|
+
index,
|
|
1159
|
+
owner: process,
|
|
1160
|
+
lock: file.clone(),
|
|
1161
|
+
abandoned: Arc::new(AtomicBool::new(false)),
|
|
1162
|
+
claimed_in: pigeonhole_io::sys::process_id(),
|
|
1163
|
+
});
|
|
1164
|
+
}
|
|
1165
|
+
Err(Error::NoReaderSlot)
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
/// Reader slots in use (claimed, not free) and the slot count.
|
|
1169
|
+
pub fn reader_slot_usage(&self) -> (u32, u32) {
|
|
1170
|
+
let inner = &self.inner;
|
|
1171
|
+
let total = inner.header.reader_slot_count;
|
|
1172
|
+
let used = (0..total)
|
|
1173
|
+
.filter(|&i| inner.slot32(i, reader_slot::STATE).load(Ordering::Relaxed) != SLOT_FREE)
|
|
1174
|
+
.count();
|
|
1175
|
+
(u32::try_from(used).unwrap_or(u32::MAX), total)
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
/// The oldest `(seqno, view_version)` pinned by any live reader slot, or `None`.
|
|
1179
|
+
///
|
|
1180
|
+
/// Each component is the minimum over the slots that pin one (a slot pins when either
|
|
1181
|
+
/// field is nonzero); a 0 component means no slot names one. The writer frees memtables
|
|
1182
|
+
/// and extents only below these. Pins are read regardless of slot state: a slot clears
|
|
1183
|
+
/// its pins before it is freed, so a free slot never contributes.
|
|
1184
|
+
pub fn oldest_reader_pin(&self) -> Option<(Seqno, u64)> {
|
|
1185
|
+
let inner = &self.inner;
|
|
1186
|
+
let mut oldest: Option<(Seqno, u64)> = None;
|
|
1187
|
+
for index in 0..inner.header.reader_slot_count {
|
|
1188
|
+
// SeqCst: pairs with `ReaderSlot::pin` (see `publish_view`).
|
|
1189
|
+
let seqno = inner
|
|
1190
|
+
.slot64(index, reader_slot::PINNED_SEQNO)
|
|
1191
|
+
.load(Ordering::SeqCst);
|
|
1192
|
+
let view = inner
|
|
1193
|
+
.slot64(index, reader_slot::PINNED_VIEW)
|
|
1194
|
+
.load(Ordering::SeqCst);
|
|
1195
|
+
if seqno == 0 && view == 0 {
|
|
1196
|
+
continue;
|
|
1197
|
+
}
|
|
1198
|
+
let min_nonzero = |a: u64, b: u64| match (a, b) {
|
|
1199
|
+
(0, b) => b,
|
|
1200
|
+
(a, 0) => a,
|
|
1201
|
+
(a, b) => a.min(b),
|
|
1202
|
+
};
|
|
1203
|
+
oldest = Some(match oldest {
|
|
1204
|
+
None => (seqno, view),
|
|
1205
|
+
Some((s, v)) => (min_nonzero(s, seqno), min_nonzero(v, view)),
|
|
1206
|
+
});
|
|
1207
|
+
}
|
|
1208
|
+
oldest
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
/// Frees the slots whose reader process is gone, judged by each slot's liveness lock
|
|
1212
|
+
/// (layout 3, #693 PR 3): the writer probes byte [`READER_LOCK_BASE`] `+ index` through
|
|
1213
|
+
/// `file`, its own handle on the database file, with a non-blocking exclusive lock. If it
|
|
1214
|
+
/// gets the byte, no process holds the slot, so the slot is freed (and the byte
|
|
1215
|
+
/// released); if the byte is held, the reader is alive. Independent of pids, so a reader
|
|
1216
|
+
/// in another pid namespace is never judged dead. Slots stuck in `claiming` (a claimer
|
|
1217
|
+
/// that died between its CAS and its `active` store, D46) are probed and freed the same
|
|
1218
|
+
/// way: a live claimer holds its byte from before its CAS. Returns how many were freed.
|
|
1219
|
+
///
|
|
1220
|
+
/// Each `active` slot is first moved to `claiming` by CAS, which keeps its owner from
|
|
1221
|
+
/// freeing it and a new reader from claiming it while the probe runs; a live owner gets
|
|
1222
|
+
/// the slot back as `active`.
|
|
1223
|
+
pub fn reclaim_dead_slots_locked(&self, file: &FileRef) -> usize {
|
|
1224
|
+
let alive = |index: u32| {
|
|
1225
|
+
let byte = READER_LOCK_BASE + u64::from(index);
|
|
1226
|
+
match file.lock(byte, LockMode::Exclusive) {
|
|
1227
|
+
Ok(()) => {
|
|
1228
|
+
let _ = file.unlock(byte);
|
|
1229
|
+
false
|
|
1230
|
+
}
|
|
1231
|
+
// Held by its reader, or the probe failed: alive (conservative).
|
|
1232
|
+
Err(_) => true,
|
|
1233
|
+
}
|
|
1234
|
+
};
|
|
1235
|
+
let inner = &self.inner;
|
|
1236
|
+
let mut reclaimed = 0;
|
|
1237
|
+
for index in 0..inner.header.reader_slot_count {
|
|
1238
|
+
let state = inner.slot32(index, reader_slot::STATE);
|
|
1239
|
+
let was = match state.compare_exchange(
|
|
1240
|
+
SLOT_ACTIVE,
|
|
1241
|
+
SLOT_CLAIMING,
|
|
1242
|
+
Ordering::AcqRel,
|
|
1243
|
+
Ordering::Relaxed,
|
|
1244
|
+
) {
|
|
1245
|
+
Ok(_) => SLOT_ACTIVE,
|
|
1246
|
+
// A claimer that may have died before recording itself: only the lock knows.
|
|
1247
|
+
Err(SLOT_CLAIMING) => SLOT_CLAIMING,
|
|
1248
|
+
Err(_) => continue,
|
|
1249
|
+
};
|
|
1250
|
+
// Only this writer can change the slot now; the owner's release waits for it.
|
|
1251
|
+
if alive(index) {
|
|
1252
|
+
// Back as it was: a live claimer finishes its own claim.
|
|
1253
|
+
if was == SLOT_ACTIVE {
|
|
1254
|
+
state.store(SLOT_ACTIVE, Ordering::Release);
|
|
1255
|
+
}
|
|
1256
|
+
continue;
|
|
1257
|
+
}
|
|
1258
|
+
inner.clear_pins(index);
|
|
1259
|
+
state.store(SLOT_FREE, Ordering::Release);
|
|
1260
|
+
reclaimed += 1;
|
|
1261
|
+
}
|
|
1262
|
+
reclaimed
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
impl ReaderSlot {
|
|
1267
|
+
/// Whether the slot is still this handle's (see [`crate::SlotOwnership::is_current`]).
|
|
1268
|
+
pub fn is_owned(&self) -> bool {
|
|
1269
|
+
!self.inert() && self.region.slot_owned_by(self.index, self.owner)
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
/// Abandoned ([`ReaderSlot::abandon`]), or used in a process other than the one that
|
|
1273
|
+
/// claimed it (a forked child, perf287's review of #898, S1): the handle stores nothing
|
|
1274
|
+
/// to the slot, and its drop frees nothing and unlocks nothing. One cached-id compare
|
|
1275
|
+
/// ([`pigeonhole_io::sys::process_id`]), no system call.
|
|
1276
|
+
fn inert(&self) -> bool {
|
|
1277
|
+
self.abandoned.load(Ordering::Acquire)
|
|
1278
|
+
|| pigeonhole_io::sys::process_id() != self.claimed_in
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
/// Gives the slot up without freeing it: releases its liveness lock now, and from then on
|
|
1282
|
+
/// this handle stores nothing to the slot (its pin calls and its drop do nothing) and
|
|
1283
|
+
/// [`ReaderSlot::is_owned`] and every [`crate::SlotOwnership`] taken from it are false.
|
|
1284
|
+
/// For a reader about to claim another slot through the same file handle while this one
|
|
1285
|
+
/// lives on: the slot of a superseded generation, which no writer reclaims, or one freed
|
|
1286
|
+
/// under it. Byte-range locks do not conflict within one handle, so if this slot kept its
|
|
1287
|
+
/// lock, a new claim could take the same byte and this slot's drop would then release it
|
|
1288
|
+
/// under the new slot (and, in the same region, free the new slot, which names the same
|
|
1289
|
+
/// process).
|
|
1290
|
+
pub fn abandon(&self) {
|
|
1291
|
+
if self.abandoned.swap(true, Ordering::AcqRel) {
|
|
1292
|
+
return;
|
|
1293
|
+
}
|
|
1294
|
+
// A forked child's copy releases nothing: the byte is the parent's.
|
|
1295
|
+
if pigeonhole_io::sys::process_id() != self.claimed_in {
|
|
1296
|
+
return;
|
|
1297
|
+
}
|
|
1298
|
+
let _ = self.lock.unlock(READER_LOCK_BASE + u64::from(self.index));
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
/// A handle that checks [`ReaderSlot::is_owned`] without holding the slot.
|
|
1302
|
+
pub fn ownership(&self) -> crate::SlotOwnership {
|
|
1303
|
+
crate::SlotOwnership {
|
|
1304
|
+
region: self.region.clone(),
|
|
1305
|
+
index: self.index,
|
|
1306
|
+
owner: self.owner,
|
|
1307
|
+
abandoned: Arc::clone(&self.abandoned),
|
|
1308
|
+
claimed_in: self.claimed_in,
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
/// Slot index.
|
|
1313
|
+
pub fn index(&self) -> u32 {
|
|
1314
|
+
self.index
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
/// Pins a snapshot: record the view version and seqno before reading through them.
|
|
1318
|
+
/// Protocol: store view, store seqno, re-read the view pointer; if it moved past the
|
|
1319
|
+
/// pinned version, take a fresh snapshot seqno and pin again with the new version
|
|
1320
|
+
/// (`FORMAT.md` §11.5). Returns the `(seqno, view_version)` pair actually pinned.
|
|
1321
|
+
///
|
|
1322
|
+
/// Call this with the version from [`ShmRegion::view_version`] *before*
|
|
1323
|
+
/// [`ShmRegion::read_view`]: if the writer published a newer view meanwhile (and may
|
|
1324
|
+
/// already have freed what the older one named), the pin moves up to the newer version
|
|
1325
|
+
/// together with a seqno taken after it, and the view read afterwards is at least that
|
|
1326
|
+
/// version. A pin protects its version and every newer one. The caller uses the returned
|
|
1327
|
+
/// pair, not the one it passed.
|
|
1328
|
+
pub fn pin(&self, seqno: Seqno, view_version: u64) -> (Seqno, u64) {
|
|
1329
|
+
self.pin_from(seqno, view_version, false)
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
/// As [`ReaderSlot::pin`], for a durable snapshot (D227, ICR 0037): a retry takes its
|
|
1333
|
+
/// fresh seqno from [`ShmRegion::durable_seqno`].
|
|
1334
|
+
pub fn pin_durable(&self, seqno: Seqno, view_version: u64) -> (Seqno, u64) {
|
|
1335
|
+
self.pin_from(seqno, view_version, true)
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
fn pin_from(&self, seqno: Seqno, view_version: u64, durable: bool) -> (Seqno, u64) {
|
|
1339
|
+
let inner = &self.region;
|
|
1340
|
+
let mut pair = (seqno, view_version);
|
|
1341
|
+
// An inert handle pins nothing ([`ReaderSlot::is_owned`] is false: its owner claims
|
|
1342
|
+
// a fresh slot before pinning).
|
|
1343
|
+
if self.inert() {
|
|
1344
|
+
return pair;
|
|
1345
|
+
}
|
|
1346
|
+
loop {
|
|
1347
|
+
inner
|
|
1348
|
+
.slot64(self.index, reader_slot::PINNED_VIEW)
|
|
1349
|
+
.store(pair.1, Ordering::SeqCst);
|
|
1350
|
+
inner
|
|
1351
|
+
.slot64(self.index, reader_slot::PINNED_SEQNO)
|
|
1352
|
+
.store(pair.0, Ordering::SeqCst);
|
|
1353
|
+
let current = inner.view_pointer(Ordering::SeqCst) >> 1;
|
|
1354
|
+
if current <= pair.1 {
|
|
1355
|
+
return pair;
|
|
1356
|
+
}
|
|
1357
|
+
let fresh = if durable {
|
|
1358
|
+
inner.durable_seqno()
|
|
1359
|
+
} else {
|
|
1360
|
+
inner.visible_seqno()
|
|
1361
|
+
};
|
|
1362
|
+
pair = (fresh.max(pair.0), current);
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
/// Lowers the pinned seqno to `seqno` if it is above it, keeping the pinned view (live
|
|
1367
|
+
/// snapshots still read through it): a durable snapshot taken while newer snapshots hold
|
|
1368
|
+
/// the pin (D227). Safe because every entry outside the memtables is at or below the
|
|
1369
|
+
/// durable seqno it was frozen under, so nothing a snapshot at `seqno` reads has been
|
|
1370
|
+
/// collapsed yet.
|
|
1371
|
+
pub fn lower_pin(&self, seqno: Seqno) {
|
|
1372
|
+
if self.inert() {
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
self.region
|
|
1376
|
+
.slot64(self.index, reader_slot::PINNED_SEQNO)
|
|
1377
|
+
.fetch_min(seqno, Ordering::SeqCst);
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
/// Raises the pin to `seqno` and `view_version` where it is lower (#693 PR 2): the
|
|
1381
|
+
/// reader's oldest snapshot was dropped, so what it pinned for that snapshot alone may be
|
|
1382
|
+
/// reclaimed. Only ever raises: a field already at or above its new value stays.
|
|
1383
|
+
pub fn raise_pin(&self, seqno: Seqno, view_version: u64) {
|
|
1384
|
+
if self.inert() {
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
self.region
|
|
1388
|
+
.slot64(self.index, reader_slot::PINNED_SEQNO)
|
|
1389
|
+
.fetch_max(seqno, Ordering::SeqCst);
|
|
1390
|
+
self.region
|
|
1391
|
+
.slot64(self.index, reader_slot::PINNED_VIEW)
|
|
1392
|
+
.fetch_max(view_version, Ordering::SeqCst);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/// Clears the pin (nothing once abandoned or in a forked child, as for
|
|
1396
|
+
/// [`ReaderSlot::lower_pin`] and [`ReaderSlot::raise_pin`]).
|
|
1397
|
+
pub fn unpin(&self) {
|
|
1398
|
+
if self.inert() {
|
|
1399
|
+
return;
|
|
1400
|
+
}
|
|
1401
|
+
self.region
|
|
1402
|
+
.slot64(self.index, reader_slot::PINNED_SEQNO)
|
|
1403
|
+
.store(0, Ordering::SeqCst);
|
|
1404
|
+
self.region
|
|
1405
|
+
.slot64(self.index, reader_slot::PINNED_VIEW)
|
|
1406
|
+
.store(0, Ordering::SeqCst);
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
impl Drop for ReaderSlot {
|
|
1411
|
+
fn drop(&mut self) {
|
|
1412
|
+
if self.inert() {
|
|
1413
|
+
return;
|
|
1414
|
+
}
|
|
1415
|
+
self.region.release_slot(self.index, self.owner);
|
|
1416
|
+
// After the slot is free: until then the writer must see this reader alive.
|
|
1417
|
+
let _ = self.lock.unlock(READER_LOCK_BASE + u64::from(self.index));
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
#[cfg(test)]
|
|
1422
|
+
mod tests {
|
|
1423
|
+
use super::*;
|
|
1424
|
+
|
|
1425
|
+
fn small() -> ShmConfig {
|
|
1426
|
+
let mut c = ShmConfig::new(2);
|
|
1427
|
+
c.arena_bytes = 2 << 20;
|
|
1428
|
+
c.reader_slots = 3;
|
|
1429
|
+
c.view_buffer_bytes = 4096;
|
|
1430
|
+
c
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
#[test]
|
|
1434
|
+
fn the_written_watermark_holds_the_feed_frontier() {
|
|
1435
|
+
// D310: `written` bounds the feed's frontier as `pending` bounds snapshots, and
|
|
1436
|
+
// `u64::MAX` (the fresh value) holds nothing.
|
|
1437
|
+
let shm = ShmRegion::in_memory([3; 16], &small());
|
|
1438
|
+
shm.advance_next_seqno(100);
|
|
1439
|
+
assert_eq!(shm.visible_seqno(), 99);
|
|
1440
|
+
assert_eq!(shm.written_seqno(false), 99);
|
|
1441
|
+
shm.publish_written(1, 40);
|
|
1442
|
+
assert_eq!(shm.written_seqno(false), 39);
|
|
1443
|
+
assert_eq!(shm.written_seqno(true), 39);
|
|
1444
|
+
assert_eq!(shm.visible_seqno(), 99, "snapshots ignore it");
|
|
1445
|
+
// A durable feed is also below every durable and synced watermark.
|
|
1446
|
+
shm.publish_durable(0, 20);
|
|
1447
|
+
assert_eq!(shm.written_seqno(true), 19);
|
|
1448
|
+
assert_eq!(shm.written_seqno(false), 39);
|
|
1449
|
+
shm.publish_synced(0, 10);
|
|
1450
|
+
assert_eq!(shm.written_seqno(true), 9);
|
|
1451
|
+
assert_eq!(shm.written_seqno(false), 39, "a visible feed ignores it");
|
|
1452
|
+
shm.publish_written(1, u64::MAX);
|
|
1453
|
+
shm.publish_durable(0, u64::MAX);
|
|
1454
|
+
shm.publish_synced(0, u64::MAX);
|
|
1455
|
+
assert_eq!(shm.written_seqno(true), 99);
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
#[test]
|
|
1459
|
+
fn fresh_region_is_idle() {
|
|
1460
|
+
let shm = ShmRegion::in_memory([3; 16], &small());
|
|
1461
|
+
assert_eq!(shm.generation(), Generation(1));
|
|
1462
|
+
assert_eq!(shm.shard_count(), 2);
|
|
1463
|
+
assert_eq!(shm.visible_seqno(), 0);
|
|
1464
|
+
assert_eq!(shm.view_version(), 0);
|
|
1465
|
+
assert_eq!(shm.manifest_version(), 0);
|
|
1466
|
+
assert!(!shm.is_stale());
|
|
1467
|
+
assert_eq!(shm.oldest_reader_pin(), None);
|
|
1468
|
+
let view = shm.read_view().unwrap();
|
|
1469
|
+
assert_eq!(view, ViewRecord::default());
|
|
1470
|
+
let (region, off, len) = shm.arena(1);
|
|
1471
|
+
assert_eq!(len, 2 << 20);
|
|
1472
|
+
assert_eq!(off % (2 << 20), 0);
|
|
1473
|
+
assert!(off + len <= region.len());
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
#[test]
|
|
1477
|
+
fn create_failures_map_to_unavailable() {
|
|
1478
|
+
use pigeonhole_io::Error as IoError;
|
|
1479
|
+
for kind in [ErrorKind::NoSpace, ErrorKind::NotFound, ErrorKind::Other] {
|
|
1480
|
+
let e = unavailable(IoError::new(kind, "size shared region"));
|
|
1481
|
+
assert!(matches!(e, Error::Unavailable), "{kind:?} gave {e:?}");
|
|
1482
|
+
}
|
|
1483
|
+
let e = unavailable(IoError::new(ErrorKind::Crashed, "open shared region"));
|
|
1484
|
+
assert!(matches!(e, Error::Io(_)), "{e:?}");
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
#[test]
|
|
1488
|
+
#[should_panic(expected = "out of range")]
|
|
1489
|
+
fn arena_out_of_range_panics() {
|
|
1490
|
+
let shm = ShmRegion::in_memory([3; 16], &small());
|
|
1491
|
+
let _ = shm.arena(2);
|
|
1492
|
+
}
|
|
1493
|
+
|
|
1494
|
+
#[test]
|
|
1495
|
+
fn view_version_zero_is_refused() {
|
|
1496
|
+
let shm = ShmRegion::in_memory([3; 16], &small());
|
|
1497
|
+
assert!(matches!(
|
|
1498
|
+
shm.publish_view(&ViewRecord::default()),
|
|
1499
|
+
Err(Error::ViewVersionNotNewer {
|
|
1500
|
+
published: 0,
|
|
1501
|
+
offered: 0
|
|
1502
|
+
})
|
|
1503
|
+
));
|
|
1504
|
+
assert_eq!(shm.view_version(), 0);
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
#[test]
|
|
1508
|
+
fn errors_display() {
|
|
1509
|
+
let e = Error::ViewTooLarge {
|
|
1510
|
+
needed: 10,
|
|
1511
|
+
capacity: 5,
|
|
1512
|
+
};
|
|
1513
|
+
assert!(e.to_string().contains("10 bytes"));
|
|
1514
|
+
let e = Error::from(pigeonhole_format::Error::UnsupportedVersion {
|
|
1515
|
+
what: "shm header",
|
|
1516
|
+
found: 9,
|
|
1517
|
+
});
|
|
1518
|
+
assert!(matches!(
|
|
1519
|
+
e,
|
|
1520
|
+
Error::VersionMismatch {
|
|
1521
|
+
found: 9,
|
|
1522
|
+
expected: 8
|
|
1523
|
+
}
|
|
1524
|
+
));
|
|
1525
|
+
let e = Error::from(pigeonhole_format::Error::Corrupt { what: "x" });
|
|
1526
|
+
assert!(matches!(e, Error::Corrupt("x")));
|
|
1527
|
+
let io = Error::from(pigeonhole_io::Error::new(ErrorKind::Locked, "lock"));
|
|
1528
|
+
assert!(std::error::Error::source(&io).is_some());
|
|
1529
|
+
assert!(std::error::Error::source(&Error::Stale).is_none());
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
/// A region's row-epoch table (D281, `FORMAT.md` §11): one atomic `u64` per slot, indexed by a
|
|
1534
|
+
/// hash of `(table, row)`. The writer raises a row's slot to a commit's seqno before the
|
|
1535
|
+
/// commit's write to the row can be visible; a row cache in any process stores and serves a
|
|
1536
|
+
/// row only under its slot's current value (D201's epoch protocol, across processes).
|
|
1537
|
+
///
|
|
1538
|
+
/// ```
|
|
1539
|
+
/// use pigeonhole_shm::{ShmConfig, ShmRegion};
|
|
1540
|
+
///
|
|
1541
|
+
/// let shm = ShmRegion::in_memory([1; 16], &ShmConfig::new(1));
|
|
1542
|
+
/// let epochs = shm.row_epochs();
|
|
1543
|
+
/// assert_eq!(epochs.epoch(42, 10), Some(0));
|
|
1544
|
+
/// epochs.note_write_prev(42, 7);
|
|
1545
|
+
/// assert_eq!(epochs.epoch(42, 10), Some(7));
|
|
1546
|
+
/// assert_eq!(epochs.epoch(42, 6), None); // written, not visible at 6
|
|
1547
|
+
/// ```
|
|
1548
|
+
#[derive(Debug, Clone)]
|
|
1549
|
+
pub struct RowEpochTable {
|
|
1550
|
+
region: SharedRegion,
|
|
1551
|
+
off: usize,
|
|
1552
|
+
mask: u64,
|
|
1553
|
+
seed: u64,
|
|
1554
|
+
maintained: bool,
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
impl RowEpochTable {
|
|
1558
|
+
/// The seed of the hash that maps a `(table, row)` to its slot (random per generation).
|
|
1559
|
+
pub fn seed(&self) -> u64 {
|
|
1560
|
+
self.seed
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
/// How many slots the table has (a power of two).
|
|
1564
|
+
pub fn slots(&self) -> usize {
|
|
1565
|
+
self.mask as usize + 1
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
/// Whether the writer raises the slots (the header's `ROW_EPOCHS_MAINTAINED`): a reader
|
|
1569
|
+
/// may cache rows only then.
|
|
1570
|
+
pub fn maintained(&self) -> bool {
|
|
1571
|
+
self.maintained
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
#[inline]
|
|
1575
|
+
fn slot(&self, hash: u64) -> &AtomicU64 {
|
|
1576
|
+
// In bounds: `decode` checked the table lies inside the region (perf287's M1).
|
|
1577
|
+
self.region
|
|
1578
|
+
.atomic_u64(self.off + (hash & self.mask) as usize * ROW_EPOCH_LEN)
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
/// The row hashing to `hash` is written at `seqno` (call before the write can be
|
|
1582
|
+
/// visible): raises its slot to `seqno`, returning the slot's value before the raise
|
|
1583
|
+
/// (ICR 0082). That is below `seqno` for a commit's first write to the row since the slot
|
|
1584
|
+
/// last moved, `seqno` itself for a later write of the same commit, and above it when a
|
|
1585
|
+
/// commit with a higher seqno already wrote a row of this slot. Writer only.
|
|
1586
|
+
///
|
|
1587
|
+
/// ```
|
|
1588
|
+
/// use pigeonhole_shm::{ShmConfig, ShmRegion};
|
|
1589
|
+
///
|
|
1590
|
+
/// let shm = ShmRegion::in_memory([1; 16], &ShmConfig::new(1));
|
|
1591
|
+
/// let epochs = shm.row_epochs();
|
|
1592
|
+
/// assert_eq!(epochs.note_write_prev(42, 7), 0);
|
|
1593
|
+
/// assert_eq!(epochs.note_write_prev(42, 7), 7); // the same commit again
|
|
1594
|
+
/// assert_eq!(epochs.note_write_prev(42, 5), 7); // a lower seqno applied later
|
|
1595
|
+
/// assert_eq!(epochs.epoch(42, 10), Some(7));
|
|
1596
|
+
/// ```
|
|
1597
|
+
#[inline]
|
|
1598
|
+
pub fn note_write_prev(&self, hash: u64, seqno: u64) -> u64 {
|
|
1599
|
+
self.slot(hash).fetch_max(seqno, Ordering::Release)
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
/// The epoch of the row hashing to `hash` for a read at `seqno` (load it after taking
|
|
1603
|
+
/// the read point): `None` when a write to it is applied but not visible at `seqno`.
|
|
1604
|
+
#[inline]
|
|
1605
|
+
pub fn epoch(&self, hash: u64, seqno: u64) -> Option<u64> {
|
|
1606
|
+
let e = self.slot(hash).load(Ordering::Acquire);
|
|
1607
|
+
(e <= seqno).then_some(e)
|
|
1608
|
+
}
|
|
1609
|
+
}
|