enclave 0.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/README.md +182 -0
- data/Rakefile +30 -0
- data/ext/enclave/enclave.c +390 -0
- data/ext/enclave/extconf.rb +33 -0
- data/ext/enclave/mruby/Makefile +63 -0
- data/ext/enclave/mruby/Rakefile +102 -0
- data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
- data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
- data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
- data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
- data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
- data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
- data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
- data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
- data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
- data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
- data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
- data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
- data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
- data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
- data/ext/enclave/mruby/build_config/RX630.rb +63 -0
- data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
- data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
- data/ext/enclave/mruby/build_config/bench.rb +11 -0
- data/ext/enclave/mruby/build_config/boxing.rb +19 -0
- data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
- data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
- data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
- data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
- data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
- data/ext/enclave/mruby/build_config/default.rb +83 -0
- data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
- data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
- data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
- data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
- data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
- data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
- data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
- data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
- data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
- data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
- data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
- data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
- data/ext/enclave/mruby/build_config/minimal.rb +4 -0
- data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
- data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
- data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
- data/ext/enclave/mruby/build_config/no-float.rb +17 -0
- data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
- data/ext/enclave/mruby/build_config/serenity.rb +26 -0
- data/ext/enclave/mruby/build_config.rb +9 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/include/mruby.h +1632 -0
- data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
- data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
- data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
- data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
- data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
- data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
- data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
- data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
- data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
- data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
- data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
- data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
- data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
- data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
- data/ext/enclave/mruby/mrblib/10error.rb +23 -0
- data/ext/enclave/mruby/mrblib/array.rb +102 -0
- data/ext/enclave/mruby/mrblib/compar.rb +102 -0
- data/ext/enclave/mruby/mrblib/enum.rb +358 -0
- data/ext/enclave/mruby/mrblib/hash.rb +276 -0
- data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
- data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
- data/ext/enclave/mruby/mrblib/range.rb +98 -0
- data/ext/enclave/mruby/mrblib/string.rb +173 -0
- data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
- data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
- data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
- data/ext/enclave/mruby/src/allocf.c +37 -0
- data/ext/enclave/mruby/src/array.c +2302 -0
- data/ext/enclave/mruby/src/backtrace.c +294 -0
- data/ext/enclave/mruby/src/cdump.c +498 -0
- data/ext/enclave/mruby/src/class.c +4394 -0
- data/ext/enclave/mruby/src/codedump.c +693 -0
- data/ext/enclave/mruby/src/debug.c +290 -0
- data/ext/enclave/mruby/src/dump.c +998 -0
- data/ext/enclave/mruby/src/enum.c +30 -0
- data/ext/enclave/mruby/src/error.c +937 -0
- data/ext/enclave/mruby/src/etc.c +421 -0
- data/ext/enclave/mruby/src/fmt_fp.c +372 -0
- data/ext/enclave/mruby/src/gc.c +1610 -0
- data/ext/enclave/mruby/src/hash.c +2355 -0
- data/ext/enclave/mruby/src/init.c +50 -0
- data/ext/enclave/mruby/src/kernel.c +718 -0
- data/ext/enclave/mruby/src/load.c +760 -0
- data/ext/enclave/mruby/src/mempool.c +225 -0
- data/ext/enclave/mruby/src/numeric.c +2420 -0
- data/ext/enclave/mruby/src/numops.c +112 -0
- data/ext/enclave/mruby/src/object.c +883 -0
- data/ext/enclave/mruby/src/print.c +136 -0
- data/ext/enclave/mruby/src/proc.c +572 -0
- data/ext/enclave/mruby/src/range.c +597 -0
- data/ext/enclave/mruby/src/readfloat.c +228 -0
- data/ext/enclave/mruby/src/readint.c +27 -0
- data/ext/enclave/mruby/src/readnum.c +43 -0
- data/ext/enclave/mruby/src/state.c +247 -0
- data/ext/enclave/mruby/src/string.c +3577 -0
- data/ext/enclave/mruby/src/symbol.c +1023 -0
- data/ext/enclave/mruby/src/value_array.h +28 -0
- data/ext/enclave/mruby/src/variable.c +1475 -0
- data/ext/enclave/mruby/src/version.c +17 -0
- data/ext/enclave/mruby/src/vm.c +3696 -0
- data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
- data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
- data/ext/enclave/mruby/tasks/bin.rake +23 -0
- data/ext/enclave/mruby/tasks/core.rake +12 -0
- data/ext/enclave/mruby/tasks/doc.rake +118 -0
- data/ext/enclave/mruby/tasks/install.rake +40 -0
- data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
- data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
- data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
- data/ext/enclave/mruby/tasks/presym.rake +57 -0
- data/ext/enclave/mruby/tasks/test.rake +84 -0
- data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
- data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
- data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
- data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
- data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
- data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
- data/ext/enclave/mruby/test/assert.rb +404 -0
- data/ext/enclave/mruby/test/bintest.rb +55 -0
- data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
- data/ext/enclave/mruby/test/t/array.rb +478 -0
- data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
- data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
- data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
- data/ext/enclave/mruby/test/t/class.rb +505 -0
- data/ext/enclave/mruby/test/t/codegen.rb +196 -0
- data/ext/enclave/mruby/test/t/comparable.rb +79 -0
- data/ext/enclave/mruby/test/t/ensure.rb +36 -0
- data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
- data/ext/enclave/mruby/test/t/exception.rb +425 -0
- data/ext/enclave/mruby/test/t/false.rb +31 -0
- data/ext/enclave/mruby/test/t/float.rb +296 -0
- data/ext/enclave/mruby/test/t/gc.rb +45 -0
- data/ext/enclave/mruby/test/t/hash.rb +976 -0
- data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
- data/ext/enclave/mruby/test/t/integer.rb +247 -0
- data/ext/enclave/mruby/test/t/iterations.rb +61 -0
- data/ext/enclave/mruby/test/t/kernel.rb +462 -0
- data/ext/enclave/mruby/test/t/lang.rb +74 -0
- data/ext/enclave/mruby/test/t/literals.rb +386 -0
- data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
- data/ext/enclave/mruby/test/t/methods.rb +138 -0
- data/ext/enclave/mruby/test/t/module.rb +931 -0
- data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
- data/ext/enclave/mruby/test/t/nil.rb +39 -0
- data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
- data/ext/enclave/mruby/test/t/numeric.rb +114 -0
- data/ext/enclave/mruby/test/t/object.rb +10 -0
- data/ext/enclave/mruby/test/t/proc.rb +198 -0
- data/ext/enclave/mruby/test/t/range.rb +194 -0
- data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
- data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
- data/ext/enclave/mruby/test/t/string.rb +981 -0
- data/ext/enclave/mruby/test/t/superclass.rb +46 -0
- data/ext/enclave/mruby/test/t/symbol.rb +30 -0
- data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
- data/ext/enclave/mruby/test/t/true.rb +31 -0
- data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/unicode.rb +39 -0
- data/ext/enclave/mruby/test/t/vformat.rb +57 -0
- data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
- data/ext/enclave/mruby/tools/lrama/MIT +21 -0
- data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
- data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
- data/ext/enclave/sandbox_build_config.rb +15 -0
- data/ext/enclave/sandbox_core.c +722 -0
- data/ext/enclave/sandbox_core.h +87 -0
- data/lib/enclave/result.rb +29 -0
- data/lib/enclave/tool.rb +38 -0
- data/lib/enclave/version.rb +3 -0
- data/lib/enclave.rb +73 -0
- metadata +819 -0
|
@@ -0,0 +1,770 @@
|
|
|
1
|
+
# mruby-task
|
|
2
|
+
|
|
3
|
+
mruby-task is an mrbgem that provides cooperative multitasking with preemptive
|
|
4
|
+
scheduling for mruby. It enables concurrent execution of multiple tasks within
|
|
5
|
+
a single mruby VM instance using a priority-based scheduler with tick-based
|
|
6
|
+
time slicing.
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
The primary purpose of `mruby-task` is to enable mruby applications to:
|
|
11
|
+
|
|
12
|
+
- Execute multiple tasks concurrently within a single VM.
|
|
13
|
+
- Schedule tasks based on priority (0-255, where 0 is highest priority).
|
|
14
|
+
- Provide cooperative yielding with `Task.pass`.
|
|
15
|
+
- Support preemptive scheduling via timer-based interrupts.
|
|
16
|
+
- Synchronize tasks using `sleep` and `join` operations.
|
|
17
|
+
- Suspend and resume tasks programmatically.
|
|
18
|
+
|
|
19
|
+
## Architecture
|
|
20
|
+
|
|
21
|
+
### Task Scheduler
|
|
22
|
+
|
|
23
|
+
The scheduler uses four priority-sorted queues:
|
|
24
|
+
|
|
25
|
+
- **DORMANT**: Tasks that have not started or have finished execution.
|
|
26
|
+
- **READY**: Tasks ready to run, ordered by priority.
|
|
27
|
+
- **WAITING**: Tasks waiting for sleep timeout or join completion.
|
|
28
|
+
- **SUSPENDED**: Tasks manually suspended via `#suspend`.
|
|
29
|
+
|
|
30
|
+
### Tick-Based Preemption
|
|
31
|
+
|
|
32
|
+
A platform-specific timer generates periodic ticks (default: 4ms). Each task
|
|
33
|
+
receives a timeslice (default: 3 ticks = 12ms) before being preempted. The
|
|
34
|
+
scheduler automatically switches to the next ready task when:
|
|
35
|
+
|
|
36
|
+
- A task's timeslice expires.
|
|
37
|
+
- A task calls `sleep`, `Task.pass`, or `join`.
|
|
38
|
+
- A task finishes execution.
|
|
39
|
+
|
|
40
|
+
## Functionality
|
|
41
|
+
|
|
42
|
+
### Creating Tasks
|
|
43
|
+
|
|
44
|
+
Tasks are created with `Task.new` and begin execution immediately:
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
# Create a task with default priority (128)
|
|
48
|
+
task = Task.new do
|
|
49
|
+
puts "Hello from task!"
|
|
50
|
+
sleep 1
|
|
51
|
+
puts "Task resumed"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Create a named task with custom priority
|
|
55
|
+
task = Task.new(name: "worker", priority: 64) do
|
|
56
|
+
loop do
|
|
57
|
+
process_data
|
|
58
|
+
Task.pass # Yield to other tasks
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Start the scheduler (blocks until all tasks complete or idle)
|
|
63
|
+
Task.run
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Task Class Methods
|
|
67
|
+
|
|
68
|
+
- **`Task.new(name: nil, priority: 128) { block }`**: Creates and starts a new task. Lower priority values run first (0 is highest priority). The `name` parameter must be a String if provided. The `priority` must be an Integer between 0-255.
|
|
69
|
+
|
|
70
|
+
```ruby
|
|
71
|
+
task = Task.new(name: "background", priority: 200) do
|
|
72
|
+
# Task code here
|
|
73
|
+
end
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **`Task.current`**: Returns the currently executing task.
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
current = Task.current
|
|
80
|
+
puts "Running: #{current.name}"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- **`Task.list`**: Returns an array of all tasks (including dormant tasks).
|
|
84
|
+
|
|
85
|
+
```ruby
|
|
86
|
+
Task.list.each do |task|
|
|
87
|
+
puts "#{task.name}: #{task.status}"
|
|
88
|
+
end
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- **`Task.pass`**: Cooperatively yields execution to other ready tasks.
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
loop do
|
|
95
|
+
do_work
|
|
96
|
+
Task.pass # Let other tasks run
|
|
97
|
+
end
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- **`Task.get(name)`**: Finds a task by name. Returns `nil` if not found.
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
worker = Task.get("worker")
|
|
104
|
+
worker.suspend if worker
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- **`Task.stat`**: Returns a hash containing scheduler statistics:
|
|
108
|
+
- `:tick` (Integer): Current tick count
|
|
109
|
+
- `:wakeup_tick` (Integer): Next scheduled wakeup tick
|
|
110
|
+
- `:dormant`, `:ready`, `:waiting`, `:suspended`: Each is a hash with:
|
|
111
|
+
- `:count` (Integer): Number of tasks in this queue
|
|
112
|
+
- `:tasks` (Array): Array of task objects in this queue
|
|
113
|
+
|
|
114
|
+
```ruby
|
|
115
|
+
stats = Task.stat
|
|
116
|
+
puts "Tick: #{stats[:tick]}"
|
|
117
|
+
puts "Ready tasks: #{stats[:ready][:count]}"
|
|
118
|
+
stats[:ready][:tasks].each { |t| puts t.name }
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- **`Task.run`**: Starts the scheduler main loop. Blocks until no tasks remain ready or waiting.
|
|
122
|
+
|
|
123
|
+
```ruby
|
|
124
|
+
Task.new { do_async_work }
|
|
125
|
+
Task.run # Run scheduler until tasks complete
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- **`Task.tick`**: Returns the current tick count in milliseconds. This is the elapsed time since the scheduler started, measured in tick units.
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
start_tick = Task.tick
|
|
132
|
+
do_work
|
|
133
|
+
elapsed = Task.tick - start_tick
|
|
134
|
+
puts "Work took #{elapsed} ms"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Task Instance Methods
|
|
138
|
+
|
|
139
|
+
- **`#status`**: Returns the task status as a symbol (`:DORMANT`, `:READY`, `:RUNNING`, `:WAITING`, `:SUSPENDED`).
|
|
140
|
+
|
|
141
|
+
```ruby
|
|
142
|
+
puts task.status # => :READY
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
- **`#name`** / **`#name=`**: Get or set the task name. Returns `"(noname)"` for unnamed tasks. Note: `name=` accepts any value, but `Task.new` requires a String.
|
|
146
|
+
|
|
147
|
+
```ruby
|
|
148
|
+
task.name = "worker-1"
|
|
149
|
+
puts task.name # => "worker-1"
|
|
150
|
+
|
|
151
|
+
task = Task.new { }
|
|
152
|
+
puts task.name # => "(noname)"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- **`#priority`** / **`#priority=`**: Get or set the task priority (0-255). Changing priority requeues the task.
|
|
156
|
+
|
|
157
|
+
```ruby
|
|
158
|
+
task.priority = 100 # Lower priority
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- **`#suspend`**: Suspends the task, moving it to the SUSPENDED queue. The task will not run until `#resume` is called.
|
|
162
|
+
|
|
163
|
+
```ruby
|
|
164
|
+
task.suspend
|
|
165
|
+
# Later...
|
|
166
|
+
task.resume
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
- **`#resume`**: Resumes a suspended task, moving it to the READY queue.
|
|
170
|
+
|
|
171
|
+
```ruby
|
|
172
|
+
task.resume
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- **`#terminate`**: Terminates the task immediately, moving it to DORMANT state.
|
|
176
|
+
|
|
177
|
+
```ruby
|
|
178
|
+
task.terminate
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- **`#join`**: Blocks the current task until the target task completes.
|
|
182
|
+
|
|
183
|
+
```ruby
|
|
184
|
+
worker = Task.new { do_long_operation }
|
|
185
|
+
worker.join # Wait for completion
|
|
186
|
+
puts "Worker finished"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Kernel Methods (Sleep)
|
|
190
|
+
|
|
191
|
+
The task scheduler provides task-aware sleep methods that cooperatively yield
|
|
192
|
+
to other tasks:
|
|
193
|
+
|
|
194
|
+
- **`sleep(seconds)`**: Sleeps for the specified duration. Accepts integers or floats (when `MRB_NO_FLOAT` is not defined).
|
|
195
|
+
|
|
196
|
+
```ruby
|
|
197
|
+
sleep 1 # Sleep for 1 second
|
|
198
|
+
sleep 0.5 # Sleep for 500ms (with float support)
|
|
199
|
+
sleep # Sleep indefinitely (no arguments)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
- **`usleep(microseconds)`**: Sleeps for the specified number of microseconds.
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
usleep 500000 # Sleep for 500ms
|
|
206
|
+
usleep 1000 # Sleep for 1ms
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
- **`sleep_ms(milliseconds)`**: Sleeps for the specified number of milliseconds.
|
|
210
|
+
|
|
211
|
+
```ruby
|
|
212
|
+
sleep_ms 100 # Sleep for 100ms
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Note**: These methods override `mruby-sleep` when both gems are present. They
|
|
216
|
+
provide task-aware cooperative sleep when called from within a task, or
|
|
217
|
+
blocking sleep when called outside task context.
|
|
218
|
+
|
|
219
|
+
## Configuration
|
|
220
|
+
|
|
221
|
+
### Build Configuration
|
|
222
|
+
|
|
223
|
+
Enable the task scheduler by including the gem in your build config:
|
|
224
|
+
|
|
225
|
+
```ruby
|
|
226
|
+
MRuby::Build.new do |conf|
|
|
227
|
+
# ... other configuration ...
|
|
228
|
+
|
|
229
|
+
conf.gem :core => 'mruby-task'
|
|
230
|
+
|
|
231
|
+
# ... other gems ...
|
|
232
|
+
end
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
This automatically defines `MRB_USE_TASK_SCHEDULER`.
|
|
236
|
+
|
|
237
|
+
### Timing Configuration
|
|
238
|
+
|
|
239
|
+
Timing parameters can be configured via C defines:
|
|
240
|
+
|
|
241
|
+
```c
|
|
242
|
+
#define MRB_TICK_UNIT 4 // Tick period in milliseconds (default: 4ms)
|
|
243
|
+
#define MRB_TIMESLICE_TICK_COUNT 3 // Ticks per timeslice (default: 3)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Default timeslice: `MRB_TICK_UNIT * MRB_TIMESLICE_TICK_COUNT = 12ms`
|
|
247
|
+
|
|
248
|
+
### Stack Configuration
|
|
249
|
+
|
|
250
|
+
Task stack and call info sizes:
|
|
251
|
+
|
|
252
|
+
```c
|
|
253
|
+
#define TASK_STACK_INIT_SIZE 64 // Initial stack entries (default: 64)
|
|
254
|
+
#define TASK_CI_INIT_SIZE 8 // Initial callinfo entries (default: 8)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
These grow automatically as needed, similar to Fiber.
|
|
258
|
+
|
|
259
|
+
## Platform Requirements
|
|
260
|
+
|
|
261
|
+
### HAL (Hardware Abstraction Layer)
|
|
262
|
+
|
|
263
|
+
The task scheduler uses a Hardware Abstraction Layer (HAL) to support different platforms. Platform-specific timer and interrupt handling is provided by separate HAL gems.
|
|
264
|
+
|
|
265
|
+
#### Built-in HAL Gems
|
|
266
|
+
|
|
267
|
+
**hal-posix-task** - For POSIX systems (Linux, macOS, BSD, Unix)
|
|
268
|
+
|
|
269
|
+
- Uses `SIGALRM` and `setitimer()` for timer
|
|
270
|
+
- Uses `sigprocmask()` for interrupt protection
|
|
271
|
+
- Uses `SA_RESTART` to prevent `EINTR` on system calls
|
|
272
|
+
- Supports multiple VMs per process
|
|
273
|
+
- **WASM/Emscripten support**: When compiled with Emscripten (`__EMSCRIPTEN__` defined), the SIGALRM timer is automatically disabled. JavaScript handles tick calls via `setInterval`, preventing double-increment of the tick counter
|
|
274
|
+
|
|
275
|
+
**hal-win-task** - For Windows
|
|
276
|
+
|
|
277
|
+
- Uses multimedia timer API (`timeSetEvent`/`timeKillEvent`)
|
|
278
|
+
- Uses `CRITICAL_SECTION` for interrupt protection
|
|
279
|
+
- Supports multiple VMs per process
|
|
280
|
+
|
|
281
|
+
#### HAL Selection
|
|
282
|
+
|
|
283
|
+
The task scheduler will automatically select an appropriate HAL gem based on your platform. For explicit control, you can specify the HAL gem in your build configuration:
|
|
284
|
+
|
|
285
|
+
```ruby
|
|
286
|
+
MRuby::Build.new do |conf|
|
|
287
|
+
# Option 1: Explicit HAL selection (recommended)
|
|
288
|
+
conf.gem core: 'hal-posix-task' # For Linux/macOS/BSD
|
|
289
|
+
# or
|
|
290
|
+
conf.gem core: 'hal-win-task' # For Windows
|
|
291
|
+
|
|
292
|
+
# mruby-task automatically loads if HAL is loaded
|
|
293
|
+
# But you can also specify it explicitly:
|
|
294
|
+
conf.gem core: 'mruby-task'
|
|
295
|
+
end
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Auto-detection behavior:**
|
|
299
|
+
|
|
300
|
+
- If you include `mruby-task` but no HAL gem, it will automatically load the appropriate HAL
|
|
301
|
+
- On Linux/macOS/BSD: loads `hal-posix-task`
|
|
302
|
+
- On Windows: loads `hal-win-task`
|
|
303
|
+
- On unknown platforms: fails with helpful error message
|
|
304
|
+
|
|
305
|
+
**Multi-VM support:**
|
|
306
|
+
|
|
307
|
+
- Both HAL implementations support multiple `mrb_state` instances
|
|
308
|
+
- A single system timer ticks all registered VMs
|
|
309
|
+
- Maximum VMs: configurable via `MRB_TASK_MAX_VMS` (default: 8)
|
|
310
|
+
|
|
311
|
+
#### Custom HAL Implementation
|
|
312
|
+
|
|
313
|
+
For embedded systems or unsupported platforms, you can create a custom HAL gem. The HAL must provide five functions defined in `mruby-task/include/task_hal.h`:
|
|
314
|
+
|
|
315
|
+
```c
|
|
316
|
+
/**
|
|
317
|
+
* Initialize timer and register VM
|
|
318
|
+
* Called during gem initialization
|
|
319
|
+
* Must set up periodic timer to call mrb_tick(mrb) every MRB_TICK_UNIT ms
|
|
320
|
+
*/
|
|
321
|
+
void mrb_task_hal_init(mrb_state *mrb);
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Cleanup timer and unregister VM
|
|
325
|
+
* Called during gem finalization
|
|
326
|
+
*/
|
|
327
|
+
void mrb_task_hal_final(mrb_state *mrb);
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Enable timer interrupts (exit critical section)
|
|
331
|
+
* Must be reentrant for nested calls
|
|
332
|
+
*/
|
|
333
|
+
void mrb_task_enable_irq(void);
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Disable timer interrupts (enter critical section)
|
|
337
|
+
* Must be reentrant for nested calls
|
|
338
|
+
*/
|
|
339
|
+
void mrb_task_disable_irq(void);
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Put CPU in low-power/idle mode
|
|
343
|
+
* Called when no tasks are ready but some are waiting
|
|
344
|
+
* Should sleep ~MRB_TICK_UNIT milliseconds
|
|
345
|
+
*/
|
|
346
|
+
void mrb_task_hal_idle_cpu(mrb_state *mrb);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Example custom HAL gem structure:**
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
mrbgems/hal-myplatform-task/
|
|
353
|
+
├── mrbgem.rake # Gem specification
|
|
354
|
+
├── include/
|
|
355
|
+
│ └── task_hal.h # Symlink to mruby-task/include/task_hal.h
|
|
356
|
+
└── src/
|
|
357
|
+
└── task_hal.c # Platform implementation
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**mrbgem.rake:**
|
|
361
|
+
|
|
362
|
+
```ruby
|
|
363
|
+
MRuby::Gem::Specification.new('hal-myplatform-task') do |spec|
|
|
364
|
+
spec.license = 'MIT'
|
|
365
|
+
spec.authors = 'Your Name'
|
|
366
|
+
spec.summary = 'My Platform HAL for mruby-task'
|
|
367
|
+
|
|
368
|
+
# HAL gem depends on feature gem (important for build order)
|
|
369
|
+
spec.add_dependency 'mruby-task', core: 'mruby-task'
|
|
370
|
+
|
|
371
|
+
# Add any platform-specific libraries or flags
|
|
372
|
+
# spec.linker.libraries << 'myplatform_timer'
|
|
373
|
+
end
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**task_hal.c example for embedded system:**
|
|
377
|
+
|
|
378
|
+
```c
|
|
379
|
+
#include <mruby.h>
|
|
380
|
+
#include "task_hal.h"
|
|
381
|
+
#include "myplatform_hardware.h"
|
|
382
|
+
|
|
383
|
+
static mrb_state *registered_vm = NULL;
|
|
384
|
+
|
|
385
|
+
void mrb_task_hal_init(mrb_state *mrb)
|
|
386
|
+
{
|
|
387
|
+
registered_vm = mrb;
|
|
388
|
+
|
|
389
|
+
// Setup hardware timer to fire every MRB_TICK_UNIT milliseconds
|
|
390
|
+
hardware_timer_init(MRB_TICK_UNIT, timer_isr);
|
|
391
|
+
hardware_timer_start();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
void mrb_task_hal_final(mrb_state *mrb)
|
|
395
|
+
{
|
|
396
|
+
hardware_timer_stop();
|
|
397
|
+
registered_vm = NULL;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
void mrb_task_enable_irq(void)
|
|
401
|
+
{
|
|
402
|
+
hardware_enable_interrupts();
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
void mrb_task_disable_irq(void)
|
|
406
|
+
{
|
|
407
|
+
hardware_disable_interrupts();
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
void mrb_task_hal_idle_cpu(mrb_state *mrb)
|
|
411
|
+
{
|
|
412
|
+
(void)mrb;
|
|
413
|
+
hardware_sleep_mode(); // Enter low-power mode until interrupt
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Timer ISR - must call mrb_tick() for scheduler
|
|
417
|
+
void timer_isr(void)
|
|
418
|
+
{
|
|
419
|
+
if (registered_vm) {
|
|
420
|
+
mrb_tick(registered_vm);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Gem initialization (required but can be empty)
|
|
425
|
+
void mrb_hal_myplatform_task_gem_init(mrb_state *mrb)
|
|
426
|
+
{
|
|
427
|
+
(void)mrb;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
void mrb_hal_myplatform_task_gem_final(mrb_state *mrb)
|
|
431
|
+
{
|
|
432
|
+
(void)mrb;
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
See `hal-posix-task` and `hal-win-task` source code for complete reference implementations.
|
|
437
|
+
|
|
438
|
+
## C API
|
|
439
|
+
|
|
440
|
+
The task scheduler provides a C API for integrating with C code and embedding environments. All exported functions are marked with `MRB_API` for external linkage.
|
|
441
|
+
|
|
442
|
+
### Core Scheduler API
|
|
443
|
+
|
|
444
|
+
```c
|
|
445
|
+
/* Tick handler - called by timer interrupt */
|
|
446
|
+
MRB_API void mrb_tick(mrb_state *mrb);
|
|
447
|
+
|
|
448
|
+
/* Main scheduler loop - blocks until all tasks complete */
|
|
449
|
+
MRB_API mrb_value mrb_task_run(mrb_state *mrb);
|
|
450
|
+
|
|
451
|
+
/* Single-step task execution for event loop integration */
|
|
452
|
+
MRB_API mrb_value mrb_task_run_once(mrb_state *mrb);
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**`mrb_task_run_once()`** executes one ready task and returns. This is designed for WASM/JavaScript event loop integration where the scheduler should yield control back to the browser between task executions.
|
|
456
|
+
|
|
457
|
+
### Task Creation API
|
|
458
|
+
|
|
459
|
+
```c
|
|
460
|
+
/* Create a task from a proc */
|
|
461
|
+
MRB_API mrb_value mrb_create_task(mrb_state *mrb, struct RProc *proc,
|
|
462
|
+
mrb_value name, mrb_value priority,
|
|
463
|
+
mrb_value top_self);
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
Creates a new task from a `RProc` object. The `name` should be a String or `mrb_nil_value()`, `priority` should be an Integer (0-255) or `mrb_nil_value()` for default priority (128), and `top_self` sets the task's self object (or `mrb_nil_value()` to use default).
|
|
467
|
+
|
|
468
|
+
### Task Control API
|
|
469
|
+
|
|
470
|
+
```c
|
|
471
|
+
/* Suspend a task - prevents it from running until resumed */
|
|
472
|
+
MRB_API void mrb_suspend_task(mrb_state *mrb, mrb_value task);
|
|
473
|
+
|
|
474
|
+
/* Resume a suspended task - moves it back to ready/waiting queue */
|
|
475
|
+
MRB_API void mrb_resume_task(mrb_state *mrb, mrb_value task);
|
|
476
|
+
|
|
477
|
+
/* Terminate a task immediately - moves to dormant state */
|
|
478
|
+
MRB_API void mrb_terminate_task(mrb_state *mrb, mrb_value task);
|
|
479
|
+
|
|
480
|
+
/* Stop a task - marks as stopped without moving to dormant */
|
|
481
|
+
MRB_API mrb_bool mrb_stop_task(mrb_state *mrb, mrb_value task);
|
|
482
|
+
|
|
483
|
+
/* Get task result value */
|
|
484
|
+
MRB_API mrb_value mrb_task_value(mrb_state *mrb, mrb_value task);
|
|
485
|
+
|
|
486
|
+
/* Get task status symbol */
|
|
487
|
+
MRB_API mrb_value mrb_task_status(mrb_state *mrb, mrb_value task);
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Note**: These functions raise `E_RUNTIME_ERROR` if called during synchronous execution (when `scheduler_lock > 0`).
|
|
491
|
+
|
|
492
|
+
### Synchronous Execution API
|
|
493
|
+
|
|
494
|
+
```c
|
|
495
|
+
/* Execute a proc synchronously without context switching */
|
|
496
|
+
MRB_API mrb_value mrb_execute_proc_synchronously(mrb_state *mrb,
|
|
497
|
+
mrb_value proc,
|
|
498
|
+
mrb_int argc,
|
|
499
|
+
const mrb_value *argv);
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
This function creates a temporary task, executes it to completion, and returns the result. During execution, the scheduler is locked (`scheduler_lock++`), preventing any asynchronous task operations. This is designed for **picoruby-wasm** to execute Ruby code synchronously from JavaScript without triggering task switches.
|
|
503
|
+
|
|
504
|
+
**Key characteristics**:
|
|
505
|
+
|
|
506
|
+
- Blocks until the proc completes execution
|
|
507
|
+
- No context switching occurs during execution
|
|
508
|
+
- Other tasks cannot be created, suspended, or resumed while locked
|
|
509
|
+
- Temporary task is automatically freed after execution
|
|
510
|
+
- If the proc raises an exception, it's returned as the result
|
|
511
|
+
|
|
512
|
+
### Task Context Management API
|
|
513
|
+
|
|
514
|
+
```c
|
|
515
|
+
/* Initialize task context with a new proc */
|
|
516
|
+
MRB_API void mrb_task_init_context(mrb_state *mrb, mrb_value task,
|
|
517
|
+
struct RProc *proc);
|
|
518
|
+
|
|
519
|
+
/* Reset task context to initial state */
|
|
520
|
+
MRB_API void mrb_task_reset_context(mrb_state *mrb, mrb_value task);
|
|
521
|
+
|
|
522
|
+
/* Set proc for task (without full reinitialization) */
|
|
523
|
+
MRB_API void mrb_task_proc_set(mrb_state *mrb, mrb_value task,
|
|
524
|
+
struct RProc *proc);
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
These functions are designed for **picoruby-sandbox** to reuse task objects for multiple executions without reallocating memory. `mrb_task_init_context()` fully reinitializes the context, while `mrb_task_proc_set()` only updates the proc pointer.
|
|
528
|
+
|
|
529
|
+
### Example: Event Loop Integration (WASM)
|
|
530
|
+
|
|
531
|
+
```c
|
|
532
|
+
/* JavaScript calls this function periodically via setInterval */
|
|
533
|
+
void js_tick_callback(void) {
|
|
534
|
+
mrb_tick(mrb);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* Main loop - called from JavaScript event loop */
|
|
538
|
+
mrb_value js_run_task_once(void) {
|
|
539
|
+
return mrb_task_run_once(mrb);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/* Execute Ruby code synchronously from JavaScript */
|
|
543
|
+
mrb_value js_eval_sync(const char *code) {
|
|
544
|
+
struct RProc *proc = mrb_generate_code(mrb, code);
|
|
545
|
+
return mrb_execute_proc_synchronously(mrb, mrb_obj_value(proc), 0, NULL);
|
|
546
|
+
}
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### Example: Task Creation from C
|
|
550
|
+
|
|
551
|
+
```c
|
|
552
|
+
/* Create a background task */
|
|
553
|
+
static mrb_value my_background_proc(mrb_state *mrb, mrb_value self) {
|
|
554
|
+
/* Task code here */
|
|
555
|
+
return mrb_nil_value();
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
void create_background_task(mrb_state *mrb) {
|
|
559
|
+
struct RProc *proc = mrb_proc_new_cfunc(mrb, my_background_proc);
|
|
560
|
+
mrb_value name = mrb_str_new_cstr(mrb, "background");
|
|
561
|
+
mrb_value priority = mrb_fixnum_value(128);
|
|
562
|
+
mrb_value task = mrb_create_task(mrb, proc, name, priority, mrb_nil_value());
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
## Examples
|
|
567
|
+
|
|
568
|
+
### Basic Multitasking
|
|
569
|
+
|
|
570
|
+
```ruby
|
|
571
|
+
Task.new(name: "task1") do
|
|
572
|
+
3.times do |i|
|
|
573
|
+
puts "Task 1: #{i}"
|
|
574
|
+
sleep 0.1
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
Task.new(name: "task2") do
|
|
579
|
+
3.times do |i|
|
|
580
|
+
puts "Task 2: #{i}"
|
|
581
|
+
sleep 0.1
|
|
582
|
+
end
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
Task.run # Run until both tasks complete
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Priority Scheduling
|
|
589
|
+
|
|
590
|
+
```ruby
|
|
591
|
+
# High priority task (runs first)
|
|
592
|
+
Task.new(priority: 0) do
|
|
593
|
+
puts "High priority"
|
|
594
|
+
sleep 0.1
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
# Low priority task (runs after high priority yields)
|
|
598
|
+
Task.new(priority: 255) do
|
|
599
|
+
puts "Low priority"
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
Task.run
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### Cooperative Yielding
|
|
606
|
+
|
|
607
|
+
```ruby
|
|
608
|
+
Task.new(name: "cooperative") do
|
|
609
|
+
loop do
|
|
610
|
+
do_some_work
|
|
611
|
+
Task.pass # Yield to other tasks
|
|
612
|
+
break if done?
|
|
613
|
+
end
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
Task.new(name: "other") do
|
|
617
|
+
do_other_work
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
Task.run
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### Task Synchronization
|
|
624
|
+
|
|
625
|
+
```ruby
|
|
626
|
+
worker = Task.new(name: "worker") do
|
|
627
|
+
puts "Working..."
|
|
628
|
+
sleep 1
|
|
629
|
+
puts "Work done"
|
|
630
|
+
42 # Return value
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
Task.new(name: "main") do
|
|
634
|
+
puts "Waiting for worker..."
|
|
635
|
+
worker.join
|
|
636
|
+
puts "Worker completed!"
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
Task.run
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
### Task Control
|
|
643
|
+
|
|
644
|
+
```ruby
|
|
645
|
+
task = Task.new do
|
|
646
|
+
loop do
|
|
647
|
+
puts "Running..."
|
|
648
|
+
sleep 0.5
|
|
649
|
+
end
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
# From another task or after Task.run returns:
|
|
653
|
+
task.suspend # Pause execution
|
|
654
|
+
sleep 1
|
|
655
|
+
task.resume # Resume execution
|
|
656
|
+
sleep 1
|
|
657
|
+
task.terminate # Stop permanently
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
## Limitations and Compatibility
|
|
661
|
+
|
|
662
|
+
### Relationship with Fiber
|
|
663
|
+
|
|
664
|
+
Tasks and Fibers both use `mrb_context` but are **not compatible**:
|
|
665
|
+
|
|
666
|
+
- Tasks are scheduled automatically by the preemptive scheduler.
|
|
667
|
+
- Fibers require explicit `Fiber.yield` and `resume` calls.
|
|
668
|
+
- Do not mix Tasks and Fibers in the same application.
|
|
669
|
+
|
|
670
|
+
### Relationship with mruby-sleep
|
|
671
|
+
|
|
672
|
+
When `mruby-task` is enabled:
|
|
673
|
+
|
|
674
|
+
- The `sleep`, `usleep`, and `sleep_ms` methods are task-aware.
|
|
675
|
+
- Inside a task, they cooperatively yield to the scheduler.
|
|
676
|
+
- Outside a task (or when scheduler is idle), they block.
|
|
677
|
+
- `mruby-sleep` should be excluded from your build when using `mruby-task`.
|
|
678
|
+
|
|
679
|
+
### Thread Safety
|
|
680
|
+
|
|
681
|
+
The task scheduler is **not thread-safe**. All tasks run in a single OS thread.
|
|
682
|
+
For multi-core concurrency, use OS threads with separate mruby VMs per thread.
|
|
683
|
+
|
|
684
|
+
### Exceptions
|
|
685
|
+
|
|
686
|
+
Uncaught exceptions in a task will terminate that task but not affect other
|
|
687
|
+
tasks. The exception is not propagated to the scheduler.
|
|
688
|
+
|
|
689
|
+
### GC Integration
|
|
690
|
+
|
|
691
|
+
Task contexts are registered with the garbage collector. Tasks and their
|
|
692
|
+
stacks/callinfo are properly marked and freed.
|
|
693
|
+
|
|
694
|
+
## Testing
|
|
695
|
+
|
|
696
|
+
The gem includes tests that verify:
|
|
697
|
+
|
|
698
|
+
- Task creation and execution
|
|
699
|
+
- Priority scheduling
|
|
700
|
+
- Sleep and wakeup
|
|
701
|
+
- Join synchronization
|
|
702
|
+
- Suspend and resume
|
|
703
|
+
- Task.pass cooperative yielding
|
|
704
|
+
|
|
705
|
+
Run tests with:
|
|
706
|
+
|
|
707
|
+
```bash
|
|
708
|
+
rake CONFIG=host-debug test:lib
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
## Implementation Details
|
|
712
|
+
|
|
713
|
+
### Task States
|
|
714
|
+
|
|
715
|
+
Each task can be in one of five states:
|
|
716
|
+
|
|
717
|
+
- `DORMANT (0x00)`: Not started or finished
|
|
718
|
+
- `READY (0x02)`: Ready to run
|
|
719
|
+
- `RUNNING (0x03)`: Currently executing
|
|
720
|
+
- `WAITING (0x04)`: Waiting (sleep, join, mutex)
|
|
721
|
+
- `SUSPENDED (0x08)`: Manually suspended
|
|
722
|
+
|
|
723
|
+
### Wait Reasons
|
|
724
|
+
|
|
725
|
+
When a task is in WAITING state, the reason indicates why:
|
|
726
|
+
|
|
727
|
+
- `NONE (0x00)`: No specific reason
|
|
728
|
+
- `SLEEP (0x01)`: Sleeping for time
|
|
729
|
+
- `MUTEX (0x02)`: Waiting for mutex (reserved, not yet implemented)
|
|
730
|
+
- `JOIN (0x04)`: Waiting for another task
|
|
731
|
+
|
|
732
|
+
### Scheduler Algorithm
|
|
733
|
+
|
|
734
|
+
1. Get the highest-priority task from the READY queue
|
|
735
|
+
2. Set task status to RUNNING and switch context (`mrb->c = &task->c`)
|
|
736
|
+
3. Execute task via `mrb_vm_exec()` until:
|
|
737
|
+
- Task yields (sleep, pass, join)
|
|
738
|
+
- Timeslice expires (preemption)
|
|
739
|
+
- Task completes or terminates
|
|
740
|
+
4. Handle completion (wake joined tasks, move to DORMANT)
|
|
741
|
+
5. Run incremental GC if needed
|
|
742
|
+
6. Requeue task to READY (if still running) or appropriate queue
|
|
743
|
+
7. Repeat from step 1
|
|
744
|
+
|
|
745
|
+
### Scheduler Lock
|
|
746
|
+
|
|
747
|
+
The scheduler includes a lock counter (`mrb->task.scheduler_lock`) that prevents asynchronous task operations during synchronous execution:
|
|
748
|
+
|
|
749
|
+
- When `scheduler_lock > 0`, asynchronous APIs (`mrb_create_task`, `mrb_suspend_task`, `mrb_resume_task`) raise `E_RUNTIME_ERROR`
|
|
750
|
+
- This ensures that synchronous execution (via `mrb_execute_proc_synchronously`) completes without interference
|
|
751
|
+
- The lock is incremented when entering synchronous execution and decremented when exiting
|
|
752
|
+
- Maximum lock depth is 254 to prevent overflow
|
|
753
|
+
|
|
754
|
+
## Future Enhancements
|
|
755
|
+
|
|
756
|
+
Planned features not yet implemented:
|
|
757
|
+
|
|
758
|
+
- **Mutex support**: Thread-safe synchronization primitives
|
|
759
|
+
- **Task.raise**: Throw exceptions to other tasks
|
|
760
|
+
- **Task#value**: Retrieve task return value (like Thread#value)
|
|
761
|
+
- **Per-task timeslice configuration**
|
|
762
|
+
|
|
763
|
+
## License
|
|
764
|
+
|
|
765
|
+
MIT License (same as mruby)
|
|
766
|
+
|
|
767
|
+
## See Also
|
|
768
|
+
|
|
769
|
+
- `mruby-fiber`: Cooperative fibers with manual control
|
|
770
|
+
- `mruby-sleep`: Blocking sleep (superseded by mruby-task)
|