summaryrefslogtreecommitdiff
path: root/mjit.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2022-09-06 12:33:51 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2022-09-06 15:45:10 +0900
commit5b3bd91fcba7224e9ece54c862dc96461cf4bf79 (patch)
treec5d0e51cd54b18cb9045b746113bb65e3b89262a /mjit.c
parentf6925fab853ffc1872038f33d93e4e5c5379b4db (diff)
Add an option to lazily boot MJIT for experiments
You may use `RUBYOPT=--mjit=pause irb` to play with RubyVM::MJIT::C, control the boot timing of MJIT, or customize the implementation while paused. It's an undocumented feature for such experiments.
Diffstat (limited to 'mjit.c')
-rw-r--r--mjit.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/mjit.c b/mjit.c
index d25fa79d24..efb40216f5 100644
--- a/mjit.c
+++ b/mjit.c
@@ -1779,6 +1779,10 @@ mjit_setup_options(const char *s, struct mjit_options *mjit_opt)
else if (opt_match_arg(s, l, "min-calls")) {
mjit_opt->min_calls = atoi(s + 1);
}
+ // --mjit=pause is an undocumented feature for experiments
+ else if (opt_match_noarg(s, l, "pause")) {
+ mjit_opt->pause = true;
+ }
else {
rb_raise(rb_eRuntimeError,
"invalid MJIT option `%s' (--help will show valid MJIT options)", s);
@@ -1870,11 +1874,15 @@ mjit_init(const struct mjit_options *opts)
// rb_fiber_init_mjit_cont again with mjit_enabled=true to set the root_fiber's mjit_cont.
rb_fiber_init_mjit_cont(GET_EC()->fiber_ptr);
- // TODO: Consider running C compiler asynchronously
- make_pch();
+ // If --mjit=pause is given, lazily start MJIT when RubyVM::MJIT.resume is called.
+ // You can use it to control MJIT warmup, or to customize the JIT implementation.
+ if (!mjit_opts.pause) {
+ // TODO: Consider running C compiler asynchronously
+ make_pch();
- // Enable MJIT compilation
- start_worker();
+ // Enable MJIT compilation
+ start_worker();
+ }
}
static void
@@ -1920,6 +1928,11 @@ mjit_resume(void)
return Qfalse;
}
+ // Lazily prepare PCH when --mjit=pause is given
+ if (pch_status == PCH_NOT_READY) {
+ make_pch();
+ }
+
if (!start_worker()) {
rb_raise(rb_eRuntimeError, "Failed to resume MJIT worker");
}
@@ -1993,7 +2006,7 @@ mjit_finish(bool close_handle_p)
mjit_dump_total_calls();
#endif
- if (!mjit_opts.save_temps && getpid() == pch_owner_pid)
+ if (!mjit_opts.save_temps && getpid() == pch_owner_pid && pch_status != PCH_NOT_READY)
remove_file(pch_file);
xfree(header_file); header_file = NULL;