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,1545 @@
|
|
|
1
|
+
//! The simulated backend: in-memory files and shared memory, deterministic from a seed, with
|
|
2
|
+
//! fault injection. `pigeonhole-sim` builds its scheduler, crash points and model on top.
|
|
3
|
+
//!
|
|
4
|
+
//! The simulator tracks, per file, the bytes the "disk" holds durably and the bytes written
|
|
5
|
+
//! since the last sync. A [`SimVfs::crash`] keeps the durable image and, depending on the
|
|
6
|
+
//! [`FaultPlan`], a seeded subset of the writes made since each file's last sync (possibly
|
|
7
|
+
//! torn at 512-byte sector granularity, possibly surviving out of order). Synced data is
|
|
8
|
+
//! never lost or reordered: a sync is a barrier.
|
|
9
|
+
//!
|
|
10
|
+
//! The model, precisely:
|
|
11
|
+
//!
|
|
12
|
+
//! - **Files.** Reads see every completed write (the page cache). `sync_all` makes
|
|
13
|
+
//! everything written to that file so far durable, size included. `sync_data` makes the
|
|
14
|
+
//! written bytes durable but not the file's length: a size change (`set_len`, `allocate`,
|
|
15
|
+
//! or a write past the end) since the last `sync_all` is durable only after the next
|
|
16
|
+
//! `sync_all`. A power loss before then reverts the length to the last `sync_all`'s (data
|
|
17
|
+
//! synced past it is lost; a shrink that was not made durable reads back as zeros), unless
|
|
18
|
+
//! a fault plan is active, in which case the pending length may survive.
|
|
19
|
+
//! - **Directory entries.** Creating or removing a file changes the visible namespace at
|
|
20
|
+
//! once, but the change is durable only after [`Vfs::sync_dir`] on its parent directory. A
|
|
21
|
+
//! power loss reverts unsynced creations and removals, like a real filesystem. Directories
|
|
22
|
+
//! themselves are implicit: any path can hold files, and listing an empty directory
|
|
23
|
+
//! returns nothing.
|
|
24
|
+
//! - **Power loss** ([`CrashKind::Power`]). Each file reverts to its durable image plus, per
|
|
25
|
+
//! the plan: nothing (no faults); an in-order prefix of its unsynced writes whose last
|
|
26
|
+
//! write may be torn (`torn_writes`); or an arbitrary subset of them, each possibly torn
|
|
27
|
+
//! (`reorder_unsynced`). Shared memory is lost.
|
|
28
|
+
//! - **Process crash** ([`CrashKind::Process`]): every simulated process dies at once.
|
|
29
|
+
//! Nothing is lost: written data stays in the (simulated) kernel, unsynced, and
|
|
30
|
+
//! shared-memory regions survive, as `/dev/shm` and `shm_open` objects do. (A Windows named
|
|
31
|
+
//! mapping would vanish once no process holds it; the simulator does not model that.)
|
|
32
|
+
//! - **One process crashing** ([`SimVfs::crash_process`]): only the handles opened by that
|
|
33
|
+
//! process (see [`SimVfs::enter_process`]) die and release their locks. Data, other
|
|
34
|
+
//! processes and shared memory are untouched.
|
|
35
|
+
//! - **Handles** killed by a crash fail with `Crashed`, and their locks are released.
|
|
36
|
+
//! Reopening through the same `SimVfs` is the restart.
|
|
37
|
+
//! - **Size.** Files are limited to 4 GiB; a write or length past that fails with `Other`
|
|
38
|
+
//! (like `EFBIG`).
|
|
39
|
+
//! - **Submitted I/O** completes before `submit_*` returns, unless deferred
|
|
40
|
+
//! ([`SimVfs::set_deferred_io`]): then it stays in flight, and nothing about it happens
|
|
41
|
+
//! (no bytes move, no crash point passes) until the simulator completes it
|
|
42
|
+
//! ([`SimVfs::complete_io`], in an order the seed chooses) or a thread blocks on its
|
|
43
|
+
//! [`Completion::wait`], which runs it. A crash before then fails it with `Crashed`: it
|
|
44
|
+
//! never happened. A handle dropped with I/O in flight stays open (its locks released)
|
|
45
|
+
//! until that I/O completes, as the kernel holds a file for its in-flight operations.
|
|
46
|
+
//!
|
|
47
|
+
//! Every random decision draws from one seeded generator in a fixed order, so a seed and
|
|
48
|
+
//! the same sequence of calls replay exactly. [`Vfs::random_u64`] is derived from the seed
|
|
49
|
+
//! with a counter of its own, so asking for values never shifts the fault decisions.
|
|
50
|
+
//! [`SimVfs::record_ops`] records every mutating operation, to check that a run replays.
|
|
51
|
+
|
|
52
|
+
use std::cell::RefCell;
|
|
53
|
+
use std::collections::{BTreeMap, HashMap, HashSet};
|
|
54
|
+
use std::fmt;
|
|
55
|
+
use std::path::{Path, PathBuf};
|
|
56
|
+
use std::sync::atomic::{AtomicU64, Ordering};
|
|
57
|
+
use std::sync::{Arc, Condvar, Mutex, MutexGuard, PoisonError, Weak};
|
|
58
|
+
use std::thread::JoinHandle;
|
|
59
|
+
use std::time::Duration;
|
|
60
|
+
|
|
61
|
+
use crate::{
|
|
62
|
+
Completion, Error, ErrorKind, File, FileIdentity, FileRef, IoBuf, LockMode, OpenOptions,
|
|
63
|
+
ProcessId, Result, SharedOpen, SharedRegion, Vfs,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
thread_local! {
|
|
67
|
+
static WAL_FOREGROUND: std::cell::Cell<u32> = const { std::cell::Cell::new(0) };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// Marks this thread's file operations as a WAL stream's foreground call (`append`, `write`,
|
|
71
|
+
/// `submit_sync`) until dropped, for [`FaultPlan::fail_on_foreground`]. The `pigeonhole-wal`
|
|
72
|
+
/// crate enters it with its `sim-hooks` feature (test builds); nothing else needs it.
|
|
73
|
+
///
|
|
74
|
+
/// ```
|
|
75
|
+
/// let _fg = pigeonhole_io::sim::WalForeground::enter();
|
|
76
|
+
/// ```
|
|
77
|
+
#[must_use = "the scope ends when this is dropped"]
|
|
78
|
+
#[derive(Debug)]
|
|
79
|
+
pub struct WalForeground(());
|
|
80
|
+
|
|
81
|
+
impl WalForeground {
|
|
82
|
+
/// Enters the scope (nests).
|
|
83
|
+
pub fn enter() -> Self {
|
|
84
|
+
WAL_FOREGROUND.with(|c| c.set(c.get() + 1));
|
|
85
|
+
WalForeground(())
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
impl Drop for WalForeground {
|
|
90
|
+
fn drop(&mut self) {
|
|
91
|
+
WAL_FOREGROUND.with(|c| c.set(c.get() - 1));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fn in_wal_foreground() -> bool {
|
|
96
|
+
WAL_FOREGROUND.try_with(|c| c.get() > 0).unwrap_or(false)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// Which faults to inject. Every random decision draws from the seeded RNG, which every
|
|
100
|
+
/// thread's I/O shares: a seed replays the decisions in call order, so where a random fault
|
|
101
|
+
/// lands depends on the threads' interleaving (#880). A scheduled fault (`crash_after_ops`,
|
|
102
|
+
/// `fail_on`) does not draw.
|
|
103
|
+
///
|
|
104
|
+
/// ```
|
|
105
|
+
/// use pigeonhole_io::sim::FaultPlan;
|
|
106
|
+
///
|
|
107
|
+
/// let mut plan = FaultPlan::none();
|
|
108
|
+
/// plan.torn_writes = true;
|
|
109
|
+
/// plan.crash_after_ops = Some(10);
|
|
110
|
+
/// assert_ne!(plan, FaultPlan::none());
|
|
111
|
+
/// ```
|
|
112
|
+
#[derive(Debug, Clone, Default, PartialEq)]
|
|
113
|
+
#[non_exhaustive]
|
|
114
|
+
pub struct FaultPlan {
|
|
115
|
+
/// On crash, unsynced writes may survive partially, torn at sector boundaries.
|
|
116
|
+
pub torn_writes: bool,
|
|
117
|
+
/// On crash, any subset of a file's unsynced writes may survive: a later one can survive
|
|
118
|
+
/// while an earlier one is lost (a disk reordering its write cache). Writes before the
|
|
119
|
+
/// file's last sync are always kept.
|
|
120
|
+
pub reorder_unsynced: bool,
|
|
121
|
+
/// Fail writes with `NoSpace` once this many bytes have been written in total.
|
|
122
|
+
pub enospc_after_bytes: Option<u64>,
|
|
123
|
+
/// Probability, per million operations, that a read or write fails with `Other`.
|
|
124
|
+
pub io_error_ppm: u32,
|
|
125
|
+
/// Crash (as [`CrashKind::Power`]) immediately after the n-th mutating operation (write,
|
|
126
|
+
/// sync, set_len, remove). Iterating `n` over every value crashes at every write point.
|
|
127
|
+
pub crash_after_ops: Option<u64>,
|
|
128
|
+
/// Fail the next write or sync of a file whose name contains this, with `Other` and
|
|
129
|
+
/// nothing written: one shot, cleared by the simulator under its lock as it fires
|
|
130
|
+
/// (`SimVfs::scheduled_fired` counts), so it cannot outlive the operation it was set
|
|
131
|
+
/// for, whatever the threads do. A test forces a shard's WAL stream to fail at a point
|
|
132
|
+
/// of its own choosing (the model check's recovery arm, #880).
|
|
133
|
+
pub fail_on: Option<&'static str>,
|
|
134
|
+
/// With `fail_on`: fire only on an operation a WAL stream's foreground call (`append`,
|
|
135
|
+
/// `write`, `submit_sync`) issues ([`WalForeground`]), not on one of its spare-slot
|
|
136
|
+
/// preparations, whose failed writes the stream tolerates (#990). Needs the
|
|
137
|
+
/// `pigeonhole-wal` crate's `sim-hooks` feature, which marks those calls.
|
|
138
|
+
pub fail_on_foreground: bool,
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
impl FaultPlan {
|
|
142
|
+
/// No faults: the plain in-memory mock.
|
|
143
|
+
pub fn none() -> Self {
|
|
144
|
+
Self::default()
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/// Every fault class enabled at moderate rates: torn and reordered unsynced writes,
|
|
148
|
+
/// `NoSpace` after 64 MiB written, and one failed read or write per thousand. No
|
|
149
|
+
/// scheduled crash (the caller picks crash points).
|
|
150
|
+
pub fn all() -> Self {
|
|
151
|
+
Self {
|
|
152
|
+
torn_writes: true,
|
|
153
|
+
reorder_unsynced: true,
|
|
154
|
+
enospc_after_bytes: Some(64 << 20),
|
|
155
|
+
io_error_ppm: 1_000,
|
|
156
|
+
crash_after_ops: None,
|
|
157
|
+
fail_on: None,
|
|
158
|
+
fail_on_foreground: false,
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// One mutating operation, as [`SimVfs::record_ops`] records it. Files are named by their
|
|
164
|
+
/// simulated node number (assigned in creation order), and written bytes by a digest, so two
|
|
165
|
+
/// runs that did the same I/O in the same order record equal traces.
|
|
166
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
167
|
+
pub enum SimOp {
|
|
168
|
+
/// `write_at` (or `submit_write`).
|
|
169
|
+
Write {
|
|
170
|
+
/// The file's node number.
|
|
171
|
+
node: u64,
|
|
172
|
+
/// Where the write started.
|
|
173
|
+
offset: u64,
|
|
174
|
+
/// Bytes written.
|
|
175
|
+
len: u64,
|
|
176
|
+
/// FNV-1a digest of the bytes written.
|
|
177
|
+
digest: u64,
|
|
178
|
+
},
|
|
179
|
+
/// `set_len`, or an `allocate` that grew the file.
|
|
180
|
+
SetLen {
|
|
181
|
+
/// The file's node number.
|
|
182
|
+
node: u64,
|
|
183
|
+
/// The new length.
|
|
184
|
+
len: u64,
|
|
185
|
+
},
|
|
186
|
+
/// `sync_data` (`metadata: false`) or `sync_all` (`metadata: true`).
|
|
187
|
+
Sync {
|
|
188
|
+
/// The file's node number.
|
|
189
|
+
node: u64,
|
|
190
|
+
/// Whether the length was made durable too.
|
|
191
|
+
metadata: bool,
|
|
192
|
+
},
|
|
193
|
+
/// [`Vfs::remove`].
|
|
194
|
+
Remove(PathBuf),
|
|
195
|
+
/// [`Vfs::sync_dir`].
|
|
196
|
+
SyncDir(PathBuf),
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// FNV-1a, for [`SimOp::Write`]'s digest.
|
|
200
|
+
fn digest(bytes: &[u8]) -> u64 {
|
|
201
|
+
bytes.iter().fold(0xcbf2_9ce4_8422_2325, |h, &b| {
|
|
202
|
+
(h ^ u64::from(b)).wrapping_mul(0x0100_0000_01b3)
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// What a crash loses.
|
|
207
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
208
|
+
pub enum CrashKind {
|
|
209
|
+
/// Every simulated process dies: data handed to the kernel (`write_at` returned)
|
|
210
|
+
/// survives, and shared-memory regions survive (as `/dev/shm` objects outlive their
|
|
211
|
+
/// processes). To kill one process, use [`SimVfs::crash_process`].
|
|
212
|
+
Process,
|
|
213
|
+
/// Power loss: only synced data survives (subject to the fault plan), shared memory is
|
|
214
|
+
/// lost.
|
|
215
|
+
Power,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/// In-memory, seeded, fault-injecting [`Vfs`]. Time only moves when advanced.
|
|
219
|
+
///
|
|
220
|
+
/// ```
|
|
221
|
+
/// use std::path::Path;
|
|
222
|
+
/// use pigeonhole_io::{ErrorKind, File, OpenOptions, Vfs};
|
|
223
|
+
/// use pigeonhole_io::sim::{CrashKind, SimVfs};
|
|
224
|
+
///
|
|
225
|
+
/// # fn main() -> pigeonhole_io::Result<()> {
|
|
226
|
+
/// let vfs = SimVfs::new(42);
|
|
227
|
+
/// let path = Path::new("/db/data.phdb");
|
|
228
|
+
/// let file = vfs.open(path, OpenOptions::read_write_create())?;
|
|
229
|
+
/// vfs.sync_dir(Path::new("/db"))?;
|
|
230
|
+
/// file.write_at(b"durable", 0)?;
|
|
231
|
+
/// file.sync_all()?; // the write grew the file, so `sync_data` alone would not do
|
|
232
|
+
/// file.write_at(b"lost", 7)?;
|
|
233
|
+
///
|
|
234
|
+
/// vfs.crash(CrashKind::Power);
|
|
235
|
+
/// assert_eq!(file.len().unwrap_err().kind, ErrorKind::Crashed);
|
|
236
|
+
///
|
|
237
|
+
/// let file = vfs.open(path, OpenOptions::read())?;
|
|
238
|
+
/// assert_eq!(file.len()?, 7);
|
|
239
|
+
/// # Ok(())
|
|
240
|
+
/// # }
|
|
241
|
+
/// ```
|
|
242
|
+
pub struct SimVfs {
|
|
243
|
+
id: u64,
|
|
244
|
+
seed: u64,
|
|
245
|
+
me: Weak<SimVfs>,
|
|
246
|
+
state: Mutex<SimState>,
|
|
247
|
+
/// Signalled when deferred I/O is submitted (for [`SimVfs::complete_io_in_background`]).
|
|
248
|
+
io_submitted: Condvar,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/// Wall clock at simulated time zero: 2026-01-01T00:00:00Z, in microseconds.
|
|
252
|
+
const WALL_BASE_MICROS: u64 = 1_767_225_600_000_000;
|
|
253
|
+
/// Sector size for torn writes.
|
|
254
|
+
const SECTOR: usize = 512;
|
|
255
|
+
/// Largest simulated file.
|
|
256
|
+
const MAX_FILE_LEN: u64 = 1 << 32;
|
|
257
|
+
/// Device number every simulated file reports.
|
|
258
|
+
const SIM_DEVICE: u64 = 0x5137;
|
|
259
|
+
/// The process a thread is in until it calls [`SimVfs::enter_process`].
|
|
260
|
+
const DEFAULT_PROCESS: ProcessId = ProcessId {
|
|
261
|
+
pid: 1,
|
|
262
|
+
start_time: 1,
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
static NEXT_SIM_ID: AtomicU64 = AtomicU64::new(0);
|
|
266
|
+
|
|
267
|
+
thread_local! {
|
|
268
|
+
/// Simulated process of this thread, per `SimVfs`.
|
|
269
|
+
static CURRENT_PROCESS: RefCell<HashMap<u64, ProcessId>> = RefCell::new(HashMap::new());
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
struct SimState {
|
|
273
|
+
rng: Rng,
|
|
274
|
+
plan: FaultPlan,
|
|
275
|
+
names: BTreeMap<PathBuf, u64>,
|
|
276
|
+
durable_names: BTreeMap<PathBuf, u64>,
|
|
277
|
+
nodes: BTreeMap<u64, Node>,
|
|
278
|
+
next_node: u64,
|
|
279
|
+
next_handle: u64,
|
|
280
|
+
bytes_written: u64,
|
|
281
|
+
ops: u64,
|
|
282
|
+
/// Scheduled faults (`FaultPlan::fail_on`) fired so far.
|
|
283
|
+
scheduled_fired: u64,
|
|
284
|
+
/// Of those, the ones that fired outside a WAL stream's foreground call.
|
|
285
|
+
scheduled_fired_outside: u64,
|
|
286
|
+
/// Random write errors (`FaultPlan::io_error_ppm`) injected so far.
|
|
287
|
+
writes_injected: u64,
|
|
288
|
+
/// Values handed out by `Vfs::random_u64`. A counter of its own, not `rng`, so asking
|
|
289
|
+
/// for one does not shift the fault decisions a seed makes.
|
|
290
|
+
random_draws: u64,
|
|
291
|
+
/// Mutating operations recorded since [`SimVfs::record_ops`], if recording.
|
|
292
|
+
trace: Option<Vec<SimOp>>,
|
|
293
|
+
shm: BTreeMap<(Option<PathBuf>, String), SharedRegion>,
|
|
294
|
+
nanos: u64,
|
|
295
|
+
/// Whether `submit_*` defers its operation (see [`SimVfs::set_deferred_io`]).
|
|
296
|
+
deferred: bool,
|
|
297
|
+
/// Whether only the submitting thread completes a deferred operation (see
|
|
298
|
+
/// [`SimVfs::set_owner_reaps`]).
|
|
299
|
+
owner_reaps: bool,
|
|
300
|
+
/// The thread that turned deferred I/O on, once the simulator registered as a backend
|
|
301
|
+
/// no thread reaps ([`SimVfs::set_deferred_io`]): only its blocked waits run the device.
|
|
302
|
+
orphan_thread: Option<std::thread::ThreadId>,
|
|
303
|
+
/// Deferred operations not yet completed, in submission order.
|
|
304
|
+
in_flight: Vec<InFlight>,
|
|
305
|
+
next_io: u64,
|
|
306
|
+
/// Picks which in-flight operation completes next. A generator of its own, so deferring
|
|
307
|
+
/// I/O never shifts the fault decisions a seed makes.
|
|
308
|
+
io_rng: Rng,
|
|
309
|
+
/// Deferred operations per handle, counting one that is running.
|
|
310
|
+
io_pins: HashMap<u64, u32>,
|
|
311
|
+
/// Handles dropped while pinned by in-flight I/O: closed when it completes.
|
|
312
|
+
closing: HashSet<u64>,
|
|
313
|
+
/// Crashes so far (a deferred file-system operation submitted before one never runs).
|
|
314
|
+
crashes: u64,
|
|
315
|
+
/// Deferred file-system operations (directory syncs) are not picked by `complete_io`
|
|
316
|
+
/// or the background device while set ([`SimVfs::hold_dir_syncs`]).
|
|
317
|
+
hold_vfs: bool,
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/// A deferred operation: `job` runs it on its file and resolves its completion.
|
|
321
|
+
struct InFlight {
|
|
322
|
+
id: u64,
|
|
323
|
+
/// A write or sync submitted inside an `inline_io` scope (a background worker's slice,
|
|
324
|
+
/// D284): [`SimVfs::inline_writes_in_flight`] counts these.
|
|
325
|
+
inline_write: bool,
|
|
326
|
+
/// The submitting thread, in owner-reaps mode: the only one that completes it.
|
|
327
|
+
owner: Option<std::thread::ThreadId>,
|
|
328
|
+
target: Target,
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/// What a deferred operation runs on.
|
|
332
|
+
enum Target {
|
|
333
|
+
/// A file's operation, run on a handle the operation pins open.
|
|
334
|
+
File {
|
|
335
|
+
node: u64,
|
|
336
|
+
handle: u64,
|
|
337
|
+
writable: bool,
|
|
338
|
+
job: Box<dyn FnOnce(&SimFile) + Send>,
|
|
339
|
+
},
|
|
340
|
+
/// A file-system operation (a directory sync, ICR 0021), told whether the simulator
|
|
341
|
+
/// crashed since it was submitted: then it never happened.
|
|
342
|
+
Vfs { crashes: u64, job: VfsJob },
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// A deferred file-system operation, told whether the simulator is still alive.
|
|
346
|
+
type VfsJob = Box<dyn FnOnce(&SimVfs, bool) + Send>;
|
|
347
|
+
|
|
348
|
+
#[derive(Default)]
|
|
349
|
+
struct Node {
|
|
350
|
+
/// What reads see.
|
|
351
|
+
data: Vec<u8>,
|
|
352
|
+
/// The data the disk holds, including bytes synced by `sync_data` past `durable_len`.
|
|
353
|
+
durable: Vec<u8>,
|
|
354
|
+
/// The file length the disk's metadata holds (as of the last `sync_all`).
|
|
355
|
+
durable_len: usize,
|
|
356
|
+
/// Changes since the last sync, in order.
|
|
357
|
+
pending: Vec<Pending>,
|
|
358
|
+
/// Live handles and the process that opened each.
|
|
359
|
+
open: BTreeMap<u64, ProcessId>,
|
|
360
|
+
/// Lock holders per byte: (handle, mode).
|
|
361
|
+
locks: BTreeMap<u64, Vec<(u64, LockMode)>>,
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/// An unsynced change; offsets and lengths were checked against `MAX_FILE_LEN`.
|
|
365
|
+
enum Pending {
|
|
366
|
+
Write { offset: usize, data: Vec<u8> },
|
|
367
|
+
SetLen(usize),
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/// SplitMix64: tiny, fast and good enough for fault decisions.
|
|
371
|
+
struct Rng(u64);
|
|
372
|
+
|
|
373
|
+
impl Rng {
|
|
374
|
+
fn next(&mut self) -> u64 {
|
|
375
|
+
self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15);
|
|
376
|
+
let mut z = self.0;
|
|
377
|
+
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
|
|
378
|
+
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
|
|
379
|
+
z ^ (z >> 31)
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/// Uniform in `0..n`.
|
|
383
|
+
fn below(&mut self, n: u64) -> u64 {
|
|
384
|
+
((u128::from(self.next()) * u128::from(n)) >> 64) as u64
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
fn coin(&mut self) -> bool {
|
|
388
|
+
self.next() & 1 == 1
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
fn crashed() -> Error {
|
|
393
|
+
Error::new(ErrorKind::Crashed, "simulated crash")
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/// `offset + len` as a file length, or an error past `MAX_FILE_LEN`.
|
|
397
|
+
fn file_end(offset: u64, len: usize, context: &'static str) -> Result<usize> {
|
|
398
|
+
offset
|
|
399
|
+
.checked_add(len as u64)
|
|
400
|
+
.filter(|&end| end <= MAX_FILE_LEN)
|
|
401
|
+
.and_then(|end| usize::try_from(end).ok())
|
|
402
|
+
.ok_or(Error::new(ErrorKind::Other, context))
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/// Writes `bytes` at `start` (a range already checked by `file_end`).
|
|
406
|
+
fn write_into(image: &mut Vec<u8>, start: usize, bytes: &[u8]) {
|
|
407
|
+
let end = start + bytes.len();
|
|
408
|
+
if image.len() < end {
|
|
409
|
+
image.resize(end, 0);
|
|
410
|
+
}
|
|
411
|
+
image[start..end].copy_from_slice(bytes);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
fn apply(image: &mut Vec<u8>, op: &Pending) {
|
|
415
|
+
match op {
|
|
416
|
+
Pending::Write { offset, data } => write_into(image, *offset, data),
|
|
417
|
+
Pending::SetLen(len) => image.resize(*len, 0),
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/// Applies a random subset of `op`'s sectors (a length change survives whole or not at all).
|
|
422
|
+
fn apply_torn(image: &mut Vec<u8>, op: &Pending, rng: &mut Rng) {
|
|
423
|
+
match op {
|
|
424
|
+
Pending::Write { offset, data } => {
|
|
425
|
+
let end = offset + data.len();
|
|
426
|
+
let mut pos = *offset;
|
|
427
|
+
while pos < end {
|
|
428
|
+
let next = ((pos / SECTOR + 1) * SECTOR).min(end);
|
|
429
|
+
if rng.coin() {
|
|
430
|
+
write_into(image, pos, &data[pos - offset..next - offset]);
|
|
431
|
+
}
|
|
432
|
+
pos = next;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
Pending::SetLen(_) => {
|
|
436
|
+
if rng.coin() {
|
|
437
|
+
apply(image, op);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
impl SimState {
|
|
444
|
+
fn node(&mut self, id: u64) -> &mut Node {
|
|
445
|
+
self.nodes.get_mut(&id).expect("live node")
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/// Fails a write or sync of `node` if [`FaultPlan::fail_on`] names its file, once: the
|
|
449
|
+
/// fault clears as it fires (#880).
|
|
450
|
+
fn scheduled(&mut self, node: u64, context: &'static str) -> Result<()> {
|
|
451
|
+
let Some(name) = self.plan.fail_on else {
|
|
452
|
+
return Ok(());
|
|
453
|
+
};
|
|
454
|
+
let named = self
|
|
455
|
+
.names
|
|
456
|
+
.iter()
|
|
457
|
+
.any(|(path, &n)| n == node && path.to_string_lossy().contains(name));
|
|
458
|
+
if named && self.plan.fail_on_foreground && !in_wal_foreground() {
|
|
459
|
+
return Ok(());
|
|
460
|
+
}
|
|
461
|
+
if named {
|
|
462
|
+
self.plan.fail_on = None;
|
|
463
|
+
self.scheduled_fired += 1;
|
|
464
|
+
if !in_wal_foreground() {
|
|
465
|
+
self.scheduled_fired_outside += 1;
|
|
466
|
+
}
|
|
467
|
+
return Err(Error::new(ErrorKind::Other, context));
|
|
468
|
+
}
|
|
469
|
+
Ok(())
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/// Fails a read or write with probability `io_error_ppm / 10^6`.
|
|
473
|
+
fn inject(&mut self, context: &'static str) -> Result<()> {
|
|
474
|
+
let ppm = self.plan.io_error_ppm;
|
|
475
|
+
if ppm > 0 && self.rng.below(1_000_000) < u64::from(ppm) {
|
|
476
|
+
return Err(Error::new(ErrorKind::Other, context));
|
|
477
|
+
}
|
|
478
|
+
Ok(())
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/// Counts (and, if recording, records) a completed mutating operation and fires a
|
|
482
|
+
/// scheduled crash.
|
|
483
|
+
fn mutated(&mut self, op: impl FnOnce() -> SimOp) {
|
|
484
|
+
if let Some(trace) = &mut self.trace {
|
|
485
|
+
trace.push(op());
|
|
486
|
+
}
|
|
487
|
+
self.ops += 1;
|
|
488
|
+
if self.plan.crash_after_ops == Some(self.ops) {
|
|
489
|
+
self.crash(CrashKind::Power);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
fn is_open(&self, node: u64, handle: u64) -> bool {
|
|
494
|
+
self.nodes
|
|
495
|
+
.get(&node)
|
|
496
|
+
.is_some_and(|n| n.open.contains_key(&handle))
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/// Closes a handle: it loses its locks, and its node goes once nothing reaches it.
|
|
500
|
+
fn close(&mut self, node: u64, handle: u64) {
|
|
501
|
+
if !self.is_open(node, handle) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
let node = self.node(node);
|
|
505
|
+
node.open.remove(&handle);
|
|
506
|
+
for holders in node.locks.values_mut() {
|
|
507
|
+
holders.retain(|&(h, _)| h != handle);
|
|
508
|
+
}
|
|
509
|
+
node.locks.retain(|_, holders| !holders.is_empty());
|
|
510
|
+
self.gc();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/// Whether an in-flight operation may be picked by the device (not a held directory sync).
|
|
514
|
+
fn has_eligible_io(&self) -> bool {
|
|
515
|
+
self.in_flight
|
|
516
|
+
.iter()
|
|
517
|
+
.any(|op| !(self.hold_vfs && matches!(op.target, Target::Vfs { .. })))
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
fn crash(&mut self, kind: CrashKind) {
|
|
521
|
+
self.crashes += 1;
|
|
522
|
+
for node in self.nodes.values_mut() {
|
|
523
|
+
node.open.clear();
|
|
524
|
+
node.locks.clear();
|
|
525
|
+
}
|
|
526
|
+
if kind == CrashKind::Power {
|
|
527
|
+
self.names = self.durable_names.clone();
|
|
528
|
+
self.shm.clear();
|
|
529
|
+
let (torn, reorder) = (self.plan.torn_writes, self.plan.reorder_unsynced);
|
|
530
|
+
for node in self.nodes.values_mut() {
|
|
531
|
+
let pending = std::mem::take(&mut node.pending);
|
|
532
|
+
let mut image = std::mem::take(&mut node.durable);
|
|
533
|
+
// A length synced only by `sync_data` survives only by luck.
|
|
534
|
+
if image.len() != node.durable_len && !((torn || reorder) && self.rng.coin()) {
|
|
535
|
+
image.resize(node.durable_len, 0);
|
|
536
|
+
}
|
|
537
|
+
if reorder {
|
|
538
|
+
for op in &pending {
|
|
539
|
+
if self.rng.coin() {
|
|
540
|
+
if torn && self.rng.coin() {
|
|
541
|
+
apply_torn(&mut image, op, &mut self.rng);
|
|
542
|
+
} else {
|
|
543
|
+
apply(&mut image, op);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
} else if torn {
|
|
548
|
+
let k = self.rng.below(pending.len() as u64 + 1) as usize;
|
|
549
|
+
for op in &pending[..k] {
|
|
550
|
+
apply(&mut image, op);
|
|
551
|
+
}
|
|
552
|
+
if let Some(op) = pending.get(k) {
|
|
553
|
+
apply_torn(&mut image, op, &mut self.rng);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
node.data.clone_from(&image);
|
|
557
|
+
node.durable_len = image.len();
|
|
558
|
+
node.durable = image;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
self.gc();
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/// Drops nodes no name (visible or durable) and no handle can reach.
|
|
565
|
+
fn gc(&mut self) {
|
|
566
|
+
let named: HashSet<u64> = self
|
|
567
|
+
.names
|
|
568
|
+
.values()
|
|
569
|
+
.chain(self.durable_names.values())
|
|
570
|
+
.copied()
|
|
571
|
+
.collect();
|
|
572
|
+
self.nodes
|
|
573
|
+
.retain(|id, node| !node.open.is_empty() || named.contains(id));
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
impl SimVfs {
|
|
578
|
+
/// A fault-free simulated filesystem (the in-memory mock).
|
|
579
|
+
pub fn new(seed: u64) -> Arc<Self> {
|
|
580
|
+
Self::with_faults(seed, FaultPlan::none())
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/// A simulated filesystem injecting `plan`.
|
|
584
|
+
pub fn with_faults(seed: u64, plan: FaultPlan) -> Arc<Self> {
|
|
585
|
+
Arc::new_cyclic(|me| Self {
|
|
586
|
+
id: NEXT_SIM_ID.fetch_add(1, Ordering::Relaxed),
|
|
587
|
+
seed,
|
|
588
|
+
me: me.clone(),
|
|
589
|
+
state: Mutex::new(SimState {
|
|
590
|
+
rng: Rng(seed),
|
|
591
|
+
plan,
|
|
592
|
+
names: BTreeMap::new(),
|
|
593
|
+
durable_names: BTreeMap::new(),
|
|
594
|
+
nodes: BTreeMap::new(),
|
|
595
|
+
next_node: 1,
|
|
596
|
+
next_handle: 1,
|
|
597
|
+
bytes_written: 0,
|
|
598
|
+
ops: 0,
|
|
599
|
+
scheduled_fired: 0,
|
|
600
|
+
scheduled_fired_outside: 0,
|
|
601
|
+
writes_injected: 0,
|
|
602
|
+
random_draws: 0,
|
|
603
|
+
trace: None,
|
|
604
|
+
shm: BTreeMap::new(),
|
|
605
|
+
nanos: 0,
|
|
606
|
+
deferred: false,
|
|
607
|
+
owner_reaps: false,
|
|
608
|
+
orphan_thread: None,
|
|
609
|
+
in_flight: Vec::new(),
|
|
610
|
+
next_io: 0,
|
|
611
|
+
io_rng: Rng(seed ^ 0x6A09_E667_F3BC_C908),
|
|
612
|
+
io_pins: HashMap::new(),
|
|
613
|
+
closing: HashSet::new(),
|
|
614
|
+
crashes: 0,
|
|
615
|
+
hold_vfs: false,
|
|
616
|
+
}),
|
|
617
|
+
io_submitted: Condvar::new(),
|
|
618
|
+
})
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
fn state(&self) -> MutexGuard<'_, SimState> {
|
|
622
|
+
self.state.lock().unwrap_or_else(PoisonError::into_inner)
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/// The seed, for printing on failure.
|
|
626
|
+
pub fn seed(&self) -> u64 {
|
|
627
|
+
self.seed
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/// Replaces the fault plan.
|
|
631
|
+
pub fn set_faults(&self, plan: FaultPlan) {
|
|
632
|
+
self.state().plan = plan;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/// How many scheduled faults ([`FaultPlan::fail_on`]) have fired since the VFS was made.
|
|
636
|
+
pub fn scheduled_fired(&self) -> u64 {
|
|
637
|
+
self.state().scheduled_fired
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/// How many of [`SimVfs::scheduled_fired`] fired outside a WAL stream's foreground call
|
|
641
|
+
/// ([`WalForeground`]): on a spare-slot preparation, say, or with the `pigeonhole-wal`
|
|
642
|
+
/// crate's `sim-hooks` feature off.
|
|
643
|
+
pub fn scheduled_fired_outside_foreground(&self) -> u64 {
|
|
644
|
+
self.state().scheduled_fired_outside
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/// How many random write errors ([`FaultPlan::io_error_ppm`]) have been injected since
|
|
648
|
+
/// the VFS was made. Counting draws nothing, so it does not shift a seed's faults.
|
|
649
|
+
pub fn writes_injected(&self) -> u64 {
|
|
650
|
+
self.state().writes_injected
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/// Simulates a crash: every open handle starts failing with `Crashed`, and the stored
|
|
654
|
+
/// state is reduced to what `kind` and the fault plan allow. Reopen through this same
|
|
655
|
+
/// `SimVfs` to recover.
|
|
656
|
+
pub fn crash(&self, kind: CrashKind) {
|
|
657
|
+
self.state().crash(kind);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/// Simulates one process crashing (as by `SIGKILL`): the handles it opened fail with
|
|
661
|
+
/// `Crashed` and lose their locks. Written data, shared memory and every other process's
|
|
662
|
+
/// handles are untouched.
|
|
663
|
+
pub fn crash_process(&self, process: ProcessId) {
|
|
664
|
+
let mut st = self.state();
|
|
665
|
+
for node in st.nodes.values_mut() {
|
|
666
|
+
let dead: Vec<u64> = node
|
|
667
|
+
.open
|
|
668
|
+
.iter()
|
|
669
|
+
.filter(|&(_, &p)| p == process)
|
|
670
|
+
.map(|(&h, _)| h)
|
|
671
|
+
.collect();
|
|
672
|
+
if dead.is_empty() {
|
|
673
|
+
continue;
|
|
674
|
+
}
|
|
675
|
+
node.open.retain(|h, _| !dead.contains(h));
|
|
676
|
+
for holders in node.locks.values_mut() {
|
|
677
|
+
holders.retain(|(h, _)| !dead.contains(h));
|
|
678
|
+
}
|
|
679
|
+
node.locks.retain(|_, holders| !holders.is_empty());
|
|
680
|
+
}
|
|
681
|
+
st.gc();
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/// Advances both clocks.
|
|
685
|
+
pub fn advance(&self, nanos: u64) {
|
|
686
|
+
let mut st = self.state();
|
|
687
|
+
st.nanos = st.nanos.saturating_add(nanos);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
/// Mutating operations performed so far (to size a crash-at-every-point sweep).
|
|
691
|
+
pub fn mutating_ops(&self) -> u64 {
|
|
692
|
+
self.state().ops
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/// Starts recording every mutating operation (discarding anything recorded so far), to
|
|
696
|
+
/// check that a seed replays the same I/O: see [`SimVfs::recorded_ops`].
|
|
697
|
+
///
|
|
698
|
+
/// ```
|
|
699
|
+
/// use std::path::Path;
|
|
700
|
+
/// use pigeonhole_io::{File, OpenOptions, Vfs};
|
|
701
|
+
/// use pigeonhole_io::sim::{SimOp, SimVfs};
|
|
702
|
+
///
|
|
703
|
+
/// # fn main() -> pigeonhole_io::Result<()> {
|
|
704
|
+
/// let vfs = SimVfs::new(1);
|
|
705
|
+
/// vfs.record_ops();
|
|
706
|
+
/// let file = vfs.open(Path::new("/db/f"), OpenOptions::read_write_create())?;
|
|
707
|
+
/// file.write_at(b"x", 0)?;
|
|
708
|
+
/// file.sync_all()?;
|
|
709
|
+
/// let ops = vfs.recorded_ops();
|
|
710
|
+
/// assert_eq!(ops.len(), 2);
|
|
711
|
+
/// assert!(matches!(ops[1], SimOp::Sync { metadata: true, .. }));
|
|
712
|
+
/// # Ok(())
|
|
713
|
+
/// # }
|
|
714
|
+
/// ```
|
|
715
|
+
pub fn record_ops(&self) {
|
|
716
|
+
self.state().trace = Some(Vec::new());
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/// The mutating operations recorded since [`SimVfs::record_ops`], in the order they
|
|
720
|
+
/// completed (empty if not recording). Recording continues.
|
|
721
|
+
pub fn recorded_ops(&self) -> Vec<SimOp> {
|
|
722
|
+
self.state().trace.clone().unwrap_or_default()
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/// Makes [`Vfs::current_process`] return `process` on the calling thread (to simulate
|
|
726
|
+
/// several processes in one test).
|
|
727
|
+
pub fn enter_process(&self, process: ProcessId) {
|
|
728
|
+
CURRENT_PROCESS.with(|m| m.borrow_mut().insert(self.id, process));
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/// Defers I/O submitted from now on (`submit_read`, `submit_write`, `submit_sync_data`,
|
|
732
|
+
/// `submit_sync_all`, `submit_sync_dir`): each operation stays in flight until
|
|
733
|
+
/// [`SimVfs::complete_io`] (or a blocking [`Completion::wait`] on it) runs it, so a
|
|
734
|
+
/// simulated run has I/O in flight across its scheduling points, as on a real device. Off
|
|
735
|
+
/// (the default), submitted I/O completes before `submit_*` returns. Turning it off
|
|
736
|
+
/// leaves operations already in flight there.
|
|
737
|
+
///
|
|
738
|
+
/// Someone must complete deferred I/O: the scheduler (`pigeonhole-sim`'s `Sim` does it
|
|
739
|
+
/// as one more task), the harness, or [`SimVfs::complete_io_in_background`] for code
|
|
740
|
+
/// that runs on threads of its own.
|
|
741
|
+
///
|
|
742
|
+
/// ```
|
|
743
|
+
/// use std::path::Path;
|
|
744
|
+
/// use pigeonhole_io::{File, IoBuf, OpenOptions, Vfs};
|
|
745
|
+
/// use pigeonhole_io::sim::SimVfs;
|
|
746
|
+
///
|
|
747
|
+
/// # fn main() -> pigeonhole_io::Result<()> {
|
|
748
|
+
/// let vfs = SimVfs::new(7);
|
|
749
|
+
/// vfs.set_deferred_io(true);
|
|
750
|
+
/// let file = vfs.open(Path::new("/db/f"), OpenOptions::read_write_create())?;
|
|
751
|
+
/// let mut buf = IoBuf::zeroed(4);
|
|
752
|
+
/// buf.copy_from_slice(b"data");
|
|
753
|
+
/// let write = file.submit_write(buf, 0);
|
|
754
|
+
/// let sync = file.submit_sync_data();
|
|
755
|
+
/// assert_eq!((file.len()?, vfs.io_in_flight()), (0, 2));
|
|
756
|
+
/// assert!(vfs.complete_io()); // one of the two, chosen by the seed
|
|
757
|
+
/// vfs.complete_all_io();
|
|
758
|
+
/// assert!(write.is_ready() && sync.is_ready());
|
|
759
|
+
/// assert_eq!(file.len()?, 4);
|
|
760
|
+
/// # Ok(())
|
|
761
|
+
/// # }
|
|
762
|
+
/// ```
|
|
763
|
+
///
|
|
764
|
+
/// Without [`SimVfs::set_owner_reaps`], the simulator is then a backend no thread reaps:
|
|
765
|
+
/// the thread that turned deferred I/O on (the harness, which completes the device's
|
|
766
|
+
/// operations between its steps) runs one deferred operation, chosen by the seed, each
|
|
767
|
+
/// time it blocks in a wait that reaps such backends (`Completion::wait` with no drive
|
|
768
|
+
/// of its own, or a WAL sync behind the stream's older syncs; ICR 0028), as a real
|
|
769
|
+
/// device finishes I/O on its own. Without it, an engine wait inside the harness's own
|
|
770
|
+
/// turn, behind I/O only the harness completes, would wait for ever. Other threads'
|
|
771
|
+
/// waits never run it, so tests sharing a process stay independent and seeds replay.
|
|
772
|
+
pub fn set_deferred_io(&self, on: bool) {
|
|
773
|
+
let mut st = self.state();
|
|
774
|
+
st.deferred = on;
|
|
775
|
+
if on && st.orphan_thread.is_none() {
|
|
776
|
+
st.orphan_thread = Some(std::thread::current().id());
|
|
777
|
+
drop(st);
|
|
778
|
+
let orphan: Weak<dyn crate::own::OrphanIo> = self.me.clone();
|
|
779
|
+
crate::own::register_orphan(orphan);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/// With deferred I/O, completes a deferred operation only on the thread that submitted
|
|
784
|
+
/// it, as an io_uring ring owned by a shard thread does (#207): by
|
|
785
|
+
/// [`reap_own_io`](crate::reap_own_io), or a blocking [`Completion::wait`] on that
|
|
786
|
+
/// thread. A wait on another thread blocks until the owner reaps. Operations submitted
|
|
787
|
+
/// before the switch keep the mode they were submitted in;
|
|
788
|
+
/// [`SimVfs::complete_io`] still completes any of them (a harness's override).
|
|
789
|
+
///
|
|
790
|
+
/// ```
|
|
791
|
+
/// use std::path::Path;
|
|
792
|
+
/// use pigeonhole_io::{File, IoBuf, OpenOptions, Vfs, own_io_in_flight, reap_own_io};
|
|
793
|
+
/// use pigeonhole_io::sim::SimVfs;
|
|
794
|
+
///
|
|
795
|
+
/// # fn main() -> pigeonhole_io::Result<()> {
|
|
796
|
+
/// let vfs = SimVfs::new(7);
|
|
797
|
+
/// vfs.set_deferred_io(true);
|
|
798
|
+
/// vfs.set_owner_reaps(true);
|
|
799
|
+
/// let file = vfs.open(Path::new("/db/f"), OpenOptions::read_write_create())?;
|
|
800
|
+
/// let sync = file.submit_sync_data();
|
|
801
|
+
/// assert!(own_io_in_flight());
|
|
802
|
+
/// // Another thread has none of its own.
|
|
803
|
+
/// assert!(!std::thread::spawn(own_io_in_flight).join().unwrap());
|
|
804
|
+
/// // A thread that waits finds the simulated device done; one that only polls does not.
|
|
805
|
+
/// assert!(!reap_own_io(None));
|
|
806
|
+
/// assert!(reap_own_io(Some(std::time::Duration::ZERO)));
|
|
807
|
+
/// assert!(sync.is_ready() && !own_io_in_flight());
|
|
808
|
+
/// # Ok(())
|
|
809
|
+
/// # }
|
|
810
|
+
/// ```
|
|
811
|
+
pub fn set_owner_reaps(&self, on: bool) {
|
|
812
|
+
self.state().owner_reaps = on;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/// Holds deferred directory syncs ([`Vfs::submit_sync_dir`]) back while `on`: neither
|
|
816
|
+
/// [`SimVfs::complete_io`] nor the background device picks them (a thread blocked on one
|
|
817
|
+
/// still runs it). A test hook for ordering after a directory sync (#158, D203).
|
|
818
|
+
pub fn hold_dir_syncs(&self, on: bool) {
|
|
819
|
+
self.state().hold_vfs = on;
|
|
820
|
+
self.io_submitted.notify_all();
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/// Deferred operations in flight.
|
|
824
|
+
pub fn io_in_flight(&self) -> usize {
|
|
825
|
+
self.state().in_flight.len()
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
/// Deferred writes and syncs still in flight that were submitted inside an
|
|
829
|
+
/// [`inline_io`](crate::inline_io) scope (a background worker's slice, D284). A worker's
|
|
830
|
+
/// task can be taken back and its output freed between slices only while this is 0
|
|
831
|
+
/// after each slice: a test's check that no output write is ever submitted from one.
|
|
832
|
+
pub fn inline_writes_in_flight(&self) -> usize {
|
|
833
|
+
self.state()
|
|
834
|
+
.in_flight
|
|
835
|
+
.iter()
|
|
836
|
+
.filter(|f| f.inline_write)
|
|
837
|
+
.count()
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/// Completes one in-flight deferred operation, chosen by the seed, on the calling thread
|
|
841
|
+
/// (its completion's continuations run here too). Returns `false` if none was in flight.
|
|
842
|
+
pub fn complete_io(&self) -> bool {
|
|
843
|
+
self.complete(None)
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/// Completes deferred operations until none is in flight, including any their
|
|
847
|
+
/// continuations submit.
|
|
848
|
+
pub fn complete_all_io(&self) {
|
|
849
|
+
while self.complete(None) {}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/// Completes deferred I/O on a thread of its own, one operation at a time in an order
|
|
853
|
+
/// the seed chooses, a few yields after each is found in flight, for code whose threads
|
|
854
|
+
/// block on submitted I/O (an engine running its own shard threads). The order is
|
|
855
|
+
/// seeded, but what is in flight when depends on the OS scheduler, so such runs do not
|
|
856
|
+
/// replay exactly. The thread ends once the `SimVfs` is dropped.
|
|
857
|
+
pub fn complete_io_in_background(self: &Arc<Self>) -> JoinHandle<()> {
|
|
858
|
+
let me = Arc::downgrade(self);
|
|
859
|
+
std::thread::Builder::new()
|
|
860
|
+
.name("sim-io".into())
|
|
861
|
+
.spawn(move || {
|
|
862
|
+
while let Some(vfs) = me.upgrade() {
|
|
863
|
+
let yields = {
|
|
864
|
+
let (st, _) = vfs
|
|
865
|
+
.io_submitted
|
|
866
|
+
.wait_timeout_while(vfs.state(), Duration::from_millis(1), |st| {
|
|
867
|
+
!st.has_eligible_io()
|
|
868
|
+
})
|
|
869
|
+
.unwrap_or_else(PoisonError::into_inner);
|
|
870
|
+
let mut st = st;
|
|
871
|
+
st.has_eligible_io().then(|| st.io_rng.below(8))
|
|
872
|
+
};
|
|
873
|
+
if let Some(yields) = yields {
|
|
874
|
+
for _ in 0..yields {
|
|
875
|
+
std::thread::yield_now();
|
|
876
|
+
}
|
|
877
|
+
vfs.complete(None);
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
})
|
|
881
|
+
.expect("spawn the simulated I/O thread")
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/// Runs `run` on `file` now, or defers it (see [`SimVfs::set_deferred_io`]).
|
|
885
|
+
fn submit<T: Send + 'static>(
|
|
886
|
+
&self,
|
|
887
|
+
file: &SimFile,
|
|
888
|
+
write: bool,
|
|
889
|
+
run: impl FnOnce(&SimFile) -> Result<T> + Send + 'static,
|
|
890
|
+
) -> Completion<T> {
|
|
891
|
+
// An operation a WAL foreground call submits stays its, wherever it runs.
|
|
892
|
+
let foreground = in_wal_foreground();
|
|
893
|
+
let run = move |f: &SimFile| {
|
|
894
|
+
let _fg = foreground.then(WalForeground::enter);
|
|
895
|
+
run(f)
|
|
896
|
+
};
|
|
897
|
+
let mut st = self.state();
|
|
898
|
+
if !st.deferred {
|
|
899
|
+
drop(st);
|
|
900
|
+
return Completion::ready(run(file));
|
|
901
|
+
}
|
|
902
|
+
let id = st.next_io;
|
|
903
|
+
st.next_io += 1;
|
|
904
|
+
*st.io_pins.entry(file.handle).or_default() += 1;
|
|
905
|
+
// Inside an inline scope (a background worker's slice, D284) the operation stays
|
|
906
|
+
// deferred, but no thread owns it: the device completes it like any other, so a task
|
|
907
|
+
// taken back from the worker never waits on that thread.
|
|
908
|
+
let owner =
|
|
909
|
+
(st.owner_reaps && !crate::own::in_inline_io()).then(|| std::thread::current().id());
|
|
910
|
+
if owner.is_some() {
|
|
911
|
+
let own: Weak<dyn crate::own::OwnIo> = self.me.clone();
|
|
912
|
+
crate::own::register(own);
|
|
913
|
+
}
|
|
914
|
+
let me = self.me.clone();
|
|
915
|
+
let (done, resolver) = Completion::driven_pair(Some(Arc::new(move || {
|
|
916
|
+
// An owner-reaped operation runs only when its own thread blocks on it.
|
|
917
|
+
if owner.is_none_or(|o| o == std::thread::current().id())
|
|
918
|
+
&& let Some(vfs) = me.upgrade()
|
|
919
|
+
{
|
|
920
|
+
vfs.complete(Some(id));
|
|
921
|
+
}
|
|
922
|
+
// Ran, or another thread must: either way, once is enough.
|
|
923
|
+
false
|
|
924
|
+
})));
|
|
925
|
+
st.in_flight.push(InFlight {
|
|
926
|
+
id,
|
|
927
|
+
inline_write: write && crate::own::in_inline_io(),
|
|
928
|
+
owner,
|
|
929
|
+
target: Target::File {
|
|
930
|
+
node: file.node,
|
|
931
|
+
handle: file.handle,
|
|
932
|
+
writable: file.writable,
|
|
933
|
+
job: Box::new(move |file| resolver.resolve(run(file))),
|
|
934
|
+
},
|
|
935
|
+
});
|
|
936
|
+
drop(st);
|
|
937
|
+
self.io_submitted.notify_all();
|
|
938
|
+
done
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/// A deferred file-system operation (no file handle): as [`SimVfs::submit`].
|
|
942
|
+
fn submit_vfs<T: Send + 'static>(
|
|
943
|
+
&self,
|
|
944
|
+
run: impl FnOnce(&SimVfs) -> Result<T> + Send + 'static,
|
|
945
|
+
) -> Completion<T> {
|
|
946
|
+
let mut st = self.state();
|
|
947
|
+
if !st.deferred {
|
|
948
|
+
drop(st);
|
|
949
|
+
return Completion::ready(run(self));
|
|
950
|
+
}
|
|
951
|
+
let id = st.next_io;
|
|
952
|
+
st.next_io += 1;
|
|
953
|
+
// Inside an inline scope (a background worker's slice, D284) the operation stays
|
|
954
|
+
// deferred, but no thread owns it: the device completes it like any other, so a task
|
|
955
|
+
// taken back from the worker never waits on that thread.
|
|
956
|
+
let owner =
|
|
957
|
+
(st.owner_reaps && !crate::own::in_inline_io()).then(|| std::thread::current().id());
|
|
958
|
+
if owner.is_some() {
|
|
959
|
+
let own: Weak<dyn crate::own::OwnIo> = self.me.clone();
|
|
960
|
+
crate::own::register(own);
|
|
961
|
+
}
|
|
962
|
+
let me = self.me.clone();
|
|
963
|
+
let (done, resolver) = Completion::driven_pair(Some(Arc::new(move || {
|
|
964
|
+
if owner.is_none_or(|o| o == std::thread::current().id())
|
|
965
|
+
&& let Some(vfs) = me.upgrade()
|
|
966
|
+
{
|
|
967
|
+
vfs.complete(Some(id));
|
|
968
|
+
}
|
|
969
|
+
false
|
|
970
|
+
})));
|
|
971
|
+
let crashes = st.crashes;
|
|
972
|
+
st.in_flight.push(InFlight {
|
|
973
|
+
id,
|
|
974
|
+
inline_write: false,
|
|
975
|
+
owner,
|
|
976
|
+
target: Target::Vfs {
|
|
977
|
+
crashes,
|
|
978
|
+
job: Box::new(move |vfs, alive| {
|
|
979
|
+
resolver.resolve(if alive { run(vfs) } else { Err(crashed()) });
|
|
980
|
+
}),
|
|
981
|
+
},
|
|
982
|
+
});
|
|
983
|
+
drop(st);
|
|
984
|
+
self.io_submitted.notify_all();
|
|
985
|
+
done
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
/// Completes the in-flight operation `id` (if still in flight), or one chosen by the
|
|
989
|
+
/// seed. Returns whether one ran.
|
|
990
|
+
fn complete(&self, id: Option<u64>) -> bool {
|
|
991
|
+
let op = {
|
|
992
|
+
let mut st = self.state();
|
|
993
|
+
let i = match id {
|
|
994
|
+
Some(id) => st.in_flight.iter().position(|op| op.id == id),
|
|
995
|
+
None => {
|
|
996
|
+
// While directory syncs are held, the device picks among the rest.
|
|
997
|
+
let held = st.hold_vfs;
|
|
998
|
+
let eligible: Vec<usize> = (0..st.in_flight.len())
|
|
999
|
+
.filter(|&i| {
|
|
1000
|
+
!(held && matches!(st.in_flight[i].target, Target::Vfs { .. }))
|
|
1001
|
+
})
|
|
1002
|
+
.collect();
|
|
1003
|
+
if eligible.is_empty() {
|
|
1004
|
+
None
|
|
1005
|
+
} else {
|
|
1006
|
+
let n = eligible.len() as u64;
|
|
1007
|
+
Some(eligible[st.io_rng.below(n) as usize])
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
};
|
|
1011
|
+
match i {
|
|
1012
|
+
Some(i) => st.in_flight.remove(i),
|
|
1013
|
+
None => return false,
|
|
1014
|
+
}
|
|
1015
|
+
};
|
|
1016
|
+
let (node, handle, writable, job) = match op.target {
|
|
1017
|
+
Target::File {
|
|
1018
|
+
node,
|
|
1019
|
+
handle,
|
|
1020
|
+
writable,
|
|
1021
|
+
job,
|
|
1022
|
+
} => (node, handle, writable, job),
|
|
1023
|
+
Target::Vfs { crashes, job } => {
|
|
1024
|
+
let alive = self.state().crashes == crashes;
|
|
1025
|
+
job(self, alive);
|
|
1026
|
+
return true;
|
|
1027
|
+
}
|
|
1028
|
+
};
|
|
1029
|
+
let file = SimFile {
|
|
1030
|
+
vfs: self.me.upgrade().expect("SimVfs is alive while borrowed"),
|
|
1031
|
+
node,
|
|
1032
|
+
handle,
|
|
1033
|
+
writable,
|
|
1034
|
+
direct: false,
|
|
1035
|
+
owner: false,
|
|
1036
|
+
};
|
|
1037
|
+
job(&file);
|
|
1038
|
+
let mut st = self.state();
|
|
1039
|
+
let pins = st.io_pins.get_mut(&handle).expect("pinned by its I/O");
|
|
1040
|
+
*pins -= 1;
|
|
1041
|
+
if *pins == 0 {
|
|
1042
|
+
st.io_pins.remove(&handle);
|
|
1043
|
+
if st.closing.remove(&handle) {
|
|
1044
|
+
st.close(node, handle);
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
true
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
impl crate::own::OrphanIo for SimVfs {
|
|
1052
|
+
/// One deferred operation (the seed picks which; held directory syncs stay held), for
|
|
1053
|
+
/// the thread that turned deferred I/O on, while it blocks; nothing in owner-reaps mode.
|
|
1054
|
+
fn reap_orphan(&self, wait: Duration) -> bool {
|
|
1055
|
+
{
|
|
1056
|
+
let st = self.state();
|
|
1057
|
+
if !st.deferred
|
|
1058
|
+
|| st.owner_reaps
|
|
1059
|
+
|| st.orphan_thread != Some(std::thread::current().id())
|
|
1060
|
+
{
|
|
1061
|
+
return false;
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
if self.complete(None) {
|
|
1065
|
+
return true;
|
|
1066
|
+
}
|
|
1067
|
+
// Nothing to run (all held, or none in flight): wait as a device would, rather than
|
|
1068
|
+
// spin the caller's loop.
|
|
1069
|
+
std::thread::sleep(wait.min(Duration::from_millis(1)));
|
|
1070
|
+
false
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
impl crate::own::OwnIo for SimVfs {
|
|
1075
|
+
fn in_flight_here(&self) -> bool {
|
|
1076
|
+
let me = std::thread::current().id();
|
|
1077
|
+
self.state().in_flight.iter().any(|op| op.owner == Some(me))
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
/// Runs every operation this thread submitted in owner-reaps mode, including any their
|
|
1081
|
+
/// continuations submit, when the thread waits (`Some`): the simulated device finishes
|
|
1082
|
+
/// them for a thread that waits for it, never in a non-waiting reap (`None`), so a
|
|
1083
|
+
/// shard's turn leaves them in flight as a harness expects.
|
|
1084
|
+
fn reap_here(&self, wait: Option<Duration>) -> bool {
|
|
1085
|
+
if wait.is_none() {
|
|
1086
|
+
return false;
|
|
1087
|
+
}
|
|
1088
|
+
let me = std::thread::current().id();
|
|
1089
|
+
let mut any = false;
|
|
1090
|
+
loop {
|
|
1091
|
+
let next = {
|
|
1092
|
+
let st = self.state();
|
|
1093
|
+
st.in_flight
|
|
1094
|
+
.iter()
|
|
1095
|
+
.find(|op| op.owner == Some(me))
|
|
1096
|
+
.map(|op| op.id)
|
|
1097
|
+
};
|
|
1098
|
+
match next {
|
|
1099
|
+
Some(id) => any |= self.complete(Some(id)),
|
|
1100
|
+
None => return any,
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
impl fmt::Debug for SimVfs {
|
|
1107
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
1108
|
+
f.debug_struct("SimVfs")
|
|
1109
|
+
.field("seed", &self.seed)
|
|
1110
|
+
.field("plan", &self.state().plan)
|
|
1111
|
+
.finish_non_exhaustive()
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
/// A handle to a simulated file.
|
|
1116
|
+
struct SimFile {
|
|
1117
|
+
vfs: Arc<SimVfs>,
|
|
1118
|
+
node: u64,
|
|
1119
|
+
handle: u64,
|
|
1120
|
+
writable: bool,
|
|
1121
|
+
/// Opened for direct I/O: every read and write must be aligned to [`SIM_DIRECT_ALIGN`],
|
|
1122
|
+
/// as the kernel demands of `O_DIRECT` (#403), so a misaligned path fails in simulation.
|
|
1123
|
+
direct: bool,
|
|
1124
|
+
/// Whether dropping this closes the handle (`false` for the view a deferred operation
|
|
1125
|
+
/// runs on).
|
|
1126
|
+
owner: bool,
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
impl fmt::Debug for SimFile {
|
|
1130
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
1131
|
+
f.debug_struct("SimFile")
|
|
1132
|
+
.field("node", &self.node)
|
|
1133
|
+
.field("handle", &self.handle)
|
|
1134
|
+
.finish_non_exhaustive()
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
impl SimFile {
|
|
1139
|
+
/// Runs `f` on the shared state if this handle has not been crashed.
|
|
1140
|
+
fn with<R>(&self, f: impl FnOnce(&mut SimState) -> Result<R>) -> Result<R> {
|
|
1141
|
+
let mut st = self.vfs.state();
|
|
1142
|
+
if !st.is_open(self.node, self.handle) {
|
|
1143
|
+
return Err(crashed());
|
|
1144
|
+
}
|
|
1145
|
+
f(&mut st)
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
fn check_writable(&self, context: &'static str) -> Result<()> {
|
|
1149
|
+
if self.writable {
|
|
1150
|
+
Ok(())
|
|
1151
|
+
} else {
|
|
1152
|
+
Err(Error::new(ErrorKind::Other, context))
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
fn change_len(&self, len: u64) -> Result<()> {
|
|
1157
|
+
self.check_writable("set_len: file not opened for writing")?;
|
|
1158
|
+
let len = file_end(len, 0, "set_len: beyond the simulated file size limit")?;
|
|
1159
|
+
self.with(|st| {
|
|
1160
|
+
let node = st.node(self.node);
|
|
1161
|
+
node.data.resize(len, 0);
|
|
1162
|
+
node.pending.push(Pending::SetLen(len));
|
|
1163
|
+
st.mutated(|| SimOp::SetLen {
|
|
1164
|
+
node: self.node,
|
|
1165
|
+
len: len as u64,
|
|
1166
|
+
});
|
|
1167
|
+
Ok(())
|
|
1168
|
+
})
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
/// Makes the pending writes durable, and the length too when `metadata` is set.
|
|
1172
|
+
fn sync(&self, metadata: bool) -> Result<()> {
|
|
1173
|
+
self.with(|st| {
|
|
1174
|
+
st.scheduled(self.node, "sync: scheduled I/O error")?;
|
|
1175
|
+
let node = st.node(self.node);
|
|
1176
|
+
for op in std::mem::take(&mut node.pending) {
|
|
1177
|
+
apply(&mut node.durable, &op);
|
|
1178
|
+
}
|
|
1179
|
+
if metadata {
|
|
1180
|
+
node.durable_len = node.durable.len();
|
|
1181
|
+
}
|
|
1182
|
+
st.mutated(|| SimOp::Sync {
|
|
1183
|
+
node: self.node,
|
|
1184
|
+
metadata,
|
|
1185
|
+
});
|
|
1186
|
+
Ok(())
|
|
1187
|
+
})
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
impl Drop for SimFile {
|
|
1192
|
+
fn drop(&mut self) {
|
|
1193
|
+
if !self.owner {
|
|
1194
|
+
return;
|
|
1195
|
+
}
|
|
1196
|
+
let mut st = self.vfs.state();
|
|
1197
|
+
if !st.io_pins.contains_key(&self.handle) {
|
|
1198
|
+
st.close(self.node, self.handle);
|
|
1199
|
+
} else if st.is_open(self.node, self.handle) {
|
|
1200
|
+
// Closed when its in-flight I/O completes; the locks go now, as with `close(2)`.
|
|
1201
|
+
st.closing.insert(self.handle);
|
|
1202
|
+
let node = st.node(self.node);
|
|
1203
|
+
for holders in node.locks.values_mut() {
|
|
1204
|
+
holders.retain(|&(h, _)| h != self.handle);
|
|
1205
|
+
}
|
|
1206
|
+
node.locks.retain(|_, holders| !holders.is_empty());
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
/// The direct-I/O alignment the simulator enforces (the common device and page size).
|
|
1212
|
+
pub const SIM_DIRECT_ALIGN: usize = 4096;
|
|
1213
|
+
|
|
1214
|
+
impl SimFile {
|
|
1215
|
+
/// On a direct handle, fails an I/O whose offset, length or buffer is not aligned.
|
|
1216
|
+
fn check_aligned(&self, ptr: *const u8, len: usize, offset: u64) -> Result<()> {
|
|
1217
|
+
let a = SIM_DIRECT_ALIGN;
|
|
1218
|
+
if self.direct
|
|
1219
|
+
&& (!offset.is_multiple_of(a as u64)
|
|
1220
|
+
|| !len.is_multiple_of(a)
|
|
1221
|
+
|| !(ptr as usize).is_multiple_of(a))
|
|
1222
|
+
{
|
|
1223
|
+
return Err(Error::new(ErrorKind::Misaligned, "direct I/O"));
|
|
1224
|
+
}
|
|
1225
|
+
Ok(())
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
impl File for SimFile {
|
|
1230
|
+
fn direct_align(&self) -> Option<usize> {
|
|
1231
|
+
self.direct.then_some(SIM_DIRECT_ALIGN)
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<()> {
|
|
1235
|
+
self.check_aligned(buf.as_ptr(), buf.len(), offset)?;
|
|
1236
|
+
self.with(|st| {
|
|
1237
|
+
if buf.is_empty() {
|
|
1238
|
+
return Ok(());
|
|
1239
|
+
}
|
|
1240
|
+
st.inject("read: injected I/O error")?;
|
|
1241
|
+
let data = &st.node(self.node).data;
|
|
1242
|
+
let end = offset.checked_add(buf.len() as u64);
|
|
1243
|
+
match end {
|
|
1244
|
+
Some(end) if end <= data.len() as u64 => {
|
|
1245
|
+
buf.copy_from_slice(&data[offset as usize..end as usize]);
|
|
1246
|
+
Ok(())
|
|
1247
|
+
}
|
|
1248
|
+
_ => Err(Error::new(ErrorKind::UnexpectedEof, "read")),
|
|
1249
|
+
}
|
|
1250
|
+
})
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
fn write_at(&self, buf: &[u8], offset: u64) -> Result<()> {
|
|
1254
|
+
self.check_writable("write: file not opened for writing")?;
|
|
1255
|
+
self.check_aligned(buf.as_ptr(), buf.len(), offset)?;
|
|
1256
|
+
self.with(|st| {
|
|
1257
|
+
if buf.is_empty() {
|
|
1258
|
+
return Ok(());
|
|
1259
|
+
}
|
|
1260
|
+
st.scheduled(self.node, "write: scheduled I/O error")?;
|
|
1261
|
+
st.inject("write: injected I/O error")
|
|
1262
|
+
.inspect_err(|_| st.writes_injected += 1)?;
|
|
1263
|
+
file_end(
|
|
1264
|
+
offset,
|
|
1265
|
+
buf.len(),
|
|
1266
|
+
"write: beyond the simulated file size limit",
|
|
1267
|
+
)?;
|
|
1268
|
+
let start = offset as usize; // in range: checked just above
|
|
1269
|
+
let len = buf.len() as u64;
|
|
1270
|
+
if let Some(limit) = st.plan.enospc_after_bytes
|
|
1271
|
+
&& st.bytes_written + len > limit
|
|
1272
|
+
{
|
|
1273
|
+
return Err(Error::new(ErrorKind::NoSpace, "write"));
|
|
1274
|
+
}
|
|
1275
|
+
st.bytes_written += len;
|
|
1276
|
+
let node = st.node(self.node);
|
|
1277
|
+
write_into(&mut node.data, start, buf);
|
|
1278
|
+
node.pending.push(Pending::Write {
|
|
1279
|
+
offset: start,
|
|
1280
|
+
data: buf.to_vec(),
|
|
1281
|
+
});
|
|
1282
|
+
st.mutated(|| SimOp::Write {
|
|
1283
|
+
node: self.node,
|
|
1284
|
+
offset,
|
|
1285
|
+
len,
|
|
1286
|
+
digest: digest(buf),
|
|
1287
|
+
});
|
|
1288
|
+
Ok(())
|
|
1289
|
+
})
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
fn submit_read(&self, mut buf: IoBuf, offset: u64) -> Completion {
|
|
1293
|
+
if let Err(e) = self.check_aligned(buf.as_ptr(), buf.len(), offset) {
|
|
1294
|
+
return Completion::ready(Err(e));
|
|
1295
|
+
}
|
|
1296
|
+
self.vfs.submit(self, false, move |f| {
|
|
1297
|
+
f.read_at(&mut buf, offset).map(|()| buf)
|
|
1298
|
+
})
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
fn submit_write(&self, buf: IoBuf, offset: u64) -> Completion {
|
|
1302
|
+
if let Err(e) = self.check_aligned(buf.as_ptr(), buf.len(), offset) {
|
|
1303
|
+
return Completion::ready(Err(e));
|
|
1304
|
+
}
|
|
1305
|
+
self.vfs
|
|
1306
|
+
.submit(self, true, move |f| f.write_at(&buf, offset).map(|()| buf))
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
fn sync_data(&self) -> Result<()> {
|
|
1310
|
+
self.sync(false)
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
fn submit_sync_data(&self) -> Completion<()> {
|
|
1314
|
+
self.vfs.submit(self, true, SimFile::sync_data)
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
fn sync_all(&self) -> Result<()> {
|
|
1318
|
+
self.sync(true)
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
fn submit_sync_all(&self) -> Completion<()> {
|
|
1322
|
+
self.vfs.submit(self, true, SimFile::sync_all)
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
fn len(&self) -> Result<u64> {
|
|
1326
|
+
self.with(|st| Ok(st.node(self.node).data.len() as u64))
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
fn set_len(&self, len: u64) -> Result<()> {
|
|
1330
|
+
self.change_len(len)
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
fn allocate(&self, offset: u64, len: u64) -> Result<()> {
|
|
1334
|
+
let end = offset
|
|
1335
|
+
.checked_add(len)
|
|
1336
|
+
.ok_or(Error::new(ErrorKind::Other, "allocate: range overflows"))?;
|
|
1337
|
+
let cur = self.len()?;
|
|
1338
|
+
if end > cur {
|
|
1339
|
+
self.change_len(end)
|
|
1340
|
+
} else {
|
|
1341
|
+
self.check_writable("allocate: file not opened for writing")
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
fn lock(&self, byte: u64, mode: LockMode) -> Result<()> {
|
|
1346
|
+
if mode == LockMode::Exclusive && !self.writable {
|
|
1347
|
+
return Err(crate::pread::exclusive_needs_write());
|
|
1348
|
+
}
|
|
1349
|
+
self.with(|st| {
|
|
1350
|
+
let holders = st.node(self.node).locks.entry(byte).or_default();
|
|
1351
|
+
let conflict = holders.iter().any(|&(h, m)| {
|
|
1352
|
+
h != self.handle && (mode == LockMode::Exclusive || m == LockMode::Exclusive)
|
|
1353
|
+
});
|
|
1354
|
+
if conflict {
|
|
1355
|
+
return Err(Error::new(ErrorKind::Locked, "lock"));
|
|
1356
|
+
}
|
|
1357
|
+
holders.retain(|&(h, _)| h != self.handle);
|
|
1358
|
+
holders.push((self.handle, mode));
|
|
1359
|
+
Ok(())
|
|
1360
|
+
})
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
fn unlock(&self, byte: u64) -> Result<()> {
|
|
1364
|
+
self.with(|st| {
|
|
1365
|
+
let locks = &mut st.node(self.node).locks;
|
|
1366
|
+
if let Some(holders) = locks.get_mut(&byte) {
|
|
1367
|
+
holders.retain(|&(h, _)| h != self.handle);
|
|
1368
|
+
if holders.is_empty() {
|
|
1369
|
+
locks.remove(&byte);
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
Ok(())
|
|
1373
|
+
})
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
fn holds(&self, byte: u64) -> Option<LockMode> {
|
|
1377
|
+
let st = self.vfs.state();
|
|
1378
|
+
let node = st.nodes.get(&self.node)?;
|
|
1379
|
+
node.locks
|
|
1380
|
+
.get(&byte)?
|
|
1381
|
+
.iter()
|
|
1382
|
+
.find(|&&(h, _)| h == self.handle)
|
|
1383
|
+
.map(|&(_, m)| m)
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
fn identity(&self) -> Result<FileIdentity> {
|
|
1387
|
+
self.with(|_| {
|
|
1388
|
+
Ok(FileIdentity {
|
|
1389
|
+
device: SIM_DEVICE,
|
|
1390
|
+
inode: self.node,
|
|
1391
|
+
})
|
|
1392
|
+
})
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
fn is_local(&self) -> Result<bool> {
|
|
1396
|
+
self.with(|_| Ok(true))
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
impl Vfs for SimVfs {
|
|
1401
|
+
fn open(&self, path: &Path, opts: OpenOptions) -> Result<FileRef> {
|
|
1402
|
+
let process = self.current_process();
|
|
1403
|
+
let mut st = self.state();
|
|
1404
|
+
let id = match st.names.get(path) {
|
|
1405
|
+
Some(_) if opts.create_new => {
|
|
1406
|
+
return Err(Error::new(ErrorKind::AlreadyExists, "open"));
|
|
1407
|
+
}
|
|
1408
|
+
Some(&id) => id,
|
|
1409
|
+
None if opts.create || opts.create_new => {
|
|
1410
|
+
let id = st.next_node;
|
|
1411
|
+
st.next_node += 1;
|
|
1412
|
+
st.nodes.insert(id, Node::default());
|
|
1413
|
+
st.names.insert(path.to_path_buf(), id);
|
|
1414
|
+
id
|
|
1415
|
+
}
|
|
1416
|
+
None => return Err(Error::new(ErrorKind::NotFound, "open")),
|
|
1417
|
+
};
|
|
1418
|
+
let handle = st.next_handle;
|
|
1419
|
+
st.next_handle += 1;
|
|
1420
|
+
st.node(id).open.insert(handle, process);
|
|
1421
|
+
Ok(Arc::new(SimFile {
|
|
1422
|
+
vfs: self.me.upgrade().expect("SimVfs is alive while borrowed"),
|
|
1423
|
+
node: id,
|
|
1424
|
+
handle,
|
|
1425
|
+
writable: opts.write || opts.create || opts.create_new,
|
|
1426
|
+
direct: opts.direct,
|
|
1427
|
+
owner: true,
|
|
1428
|
+
}))
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
fn remove(&self, path: &Path) -> Result<()> {
|
|
1432
|
+
let mut st = self.state();
|
|
1433
|
+
if st.names.remove(path).is_none() {
|
|
1434
|
+
return Err(Error::new(ErrorKind::NotFound, "remove"));
|
|
1435
|
+
}
|
|
1436
|
+
st.gc();
|
|
1437
|
+
st.mutated(|| SimOp::Remove(path.to_path_buf()));
|
|
1438
|
+
Ok(())
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
fn exists(&self, path: &Path) -> Result<bool> {
|
|
1442
|
+
Ok(self.state().names.contains_key(path))
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
fn list_dir(&self, dir: &Path) -> Result<Vec<PathBuf>> {
|
|
1446
|
+
Ok(self
|
|
1447
|
+
.state()
|
|
1448
|
+
.names
|
|
1449
|
+
.keys()
|
|
1450
|
+
.filter(|p| p.parent() == Some(dir))
|
|
1451
|
+
.cloned()
|
|
1452
|
+
.collect())
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
fn submit_sync_dir(&self, dir: &Path) -> Completion<()> {
|
|
1456
|
+
// Deferred like any submitted operation (ICR 0021): the directory's entries become
|
|
1457
|
+
// durable only when the simulated device completes it, and a crash before then
|
|
1458
|
+
// means it never happened.
|
|
1459
|
+
let dir = dir.to_path_buf();
|
|
1460
|
+
self.submit_vfs(move |vfs| vfs.sync_dir(&dir))
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
fn sync_dir(&self, dir: &Path) -> Result<()> {
|
|
1464
|
+
let mut st = self.state();
|
|
1465
|
+
st.durable_names.retain(|p, _| p.parent() != Some(dir));
|
|
1466
|
+
let entries: Vec<(PathBuf, u64)> = st
|
|
1467
|
+
.names
|
|
1468
|
+
.iter()
|
|
1469
|
+
.filter(|(p, _)| p.parent() == Some(dir))
|
|
1470
|
+
.map(|(p, &id)| (p.clone(), id))
|
|
1471
|
+
.collect();
|
|
1472
|
+
st.durable_names.extend(entries);
|
|
1473
|
+
st.gc();
|
|
1474
|
+
st.mutated(|| SimOp::SyncDir(dir.to_path_buf()));
|
|
1475
|
+
Ok(())
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
fn open_shared(
|
|
1479
|
+
&self,
|
|
1480
|
+
name: &str,
|
|
1481
|
+
dir: Option<&Path>,
|
|
1482
|
+
len: u64,
|
|
1483
|
+
mode: SharedOpen,
|
|
1484
|
+
) -> Result<SharedRegion> {
|
|
1485
|
+
crate::os::check_shared_name(name)?;
|
|
1486
|
+
if len == 0 {
|
|
1487
|
+
return Err(Error::new(ErrorKind::Other, "shared region is empty"));
|
|
1488
|
+
}
|
|
1489
|
+
let size =
|
|
1490
|
+
usize::try_from(len).map_err(|_| Error::new(ErrorKind::Other, "region too large"))?;
|
|
1491
|
+
let key = (dir.map(Path::to_path_buf), name.to_owned());
|
|
1492
|
+
let mut st = self.state();
|
|
1493
|
+
match (mode, st.shm.get(&key)) {
|
|
1494
|
+
(SharedOpen::CreateNew, Some(_)) => {
|
|
1495
|
+
Err(Error::new(ErrorKind::AlreadyExists, "open shared region"))
|
|
1496
|
+
}
|
|
1497
|
+
(SharedOpen::CreateNew, None) => {
|
|
1498
|
+
let region = SharedRegion::heap(size);
|
|
1499
|
+
st.shm.insert(key, region.clone());
|
|
1500
|
+
Ok(region)
|
|
1501
|
+
}
|
|
1502
|
+
(SharedOpen::Attach, None) => {
|
|
1503
|
+
Err(Error::new(ErrorKind::NotFound, "open shared region"))
|
|
1504
|
+
}
|
|
1505
|
+
(SharedOpen::Attach, Some(region)) if region.len() < size => Err(Error::new(
|
|
1506
|
+
ErrorKind::Other,
|
|
1507
|
+
"shared region is smaller than requested",
|
|
1508
|
+
)),
|
|
1509
|
+
(SharedOpen::Attach, Some(region)) => Ok(region.clone()),
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
fn remove_shared(&self, name: &str, dir: Option<&Path>) -> Result<()> {
|
|
1514
|
+
crate::os::check_shared_name(name)?;
|
|
1515
|
+
let key = (dir.map(Path::to_path_buf), name.to_owned());
|
|
1516
|
+
match self.state().shm.remove(&key) {
|
|
1517
|
+
Some(_) => Ok(()),
|
|
1518
|
+
None => Err(Error::new(ErrorKind::NotFound, "remove shared region")),
|
|
1519
|
+
}
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
fn now_micros(&self) -> u64 {
|
|
1523
|
+
WALL_BASE_MICROS + self.state().nanos / 1_000
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
fn monotonic_nanos(&self) -> u64 {
|
|
1527
|
+
self.state().nanos
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
fn clock_is_simulated(&self) -> bool {
|
|
1531
|
+
true
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
fn current_process(&self) -> ProcessId {
|
|
1535
|
+
CURRENT_PROCESS.with(|m| m.borrow().get(&self.id).copied().unwrap_or(DEFAULT_PROCESS))
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
/// Derived from the seed and a counter of its own (not the fault generator), so a seed
|
|
1539
|
+
/// replays the same values and asking for them never shifts its fault decisions.
|
|
1540
|
+
fn random_u64(&self) -> u64 {
|
|
1541
|
+
let mut st = self.state();
|
|
1542
|
+
st.random_draws += 1;
|
|
1543
|
+
Rng(self.seed ^ st.random_draws.wrapping_mul(0xA076_1D64_78BD_642F)).next()
|
|
1544
|
+
}
|
|
1545
|
+
}
|