[前][次][番号順一覧][スレッド一覧]

ruby-changes:73443

From: Takashi <ko1@a...>
Date: Tue, 6 Sep 2022 15:49:24 +0900 (JST)
Subject: [ruby-changes:73443] 5b3bd91fcb (master): Add an option to lazily boot MJIT for experiments

https://git.ruby-lang.org/ruby.git/commit/?id=5b3bd91fcb

From 5b3bd91fcba7224e9ece54c862dc96461cf4bf79 Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Tue, 6 Sep 2022 12:33:51 +0900
Subject: 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.
---
 mjit.c | 23 ++++++++++++++++++-----
 mjit.h |  4 +++-
 2 files changed, 21 insertions(+), 6 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) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1779
     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) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1874
     // 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) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1928
         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) https://github.com/ruby/ruby/blob/trunk/mjit.c#L2006
     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;
diff --git a/mjit.h b/mjit.h
index 55b9fbcfcd..130ab5abae 100644
--- a/mjit.h
+++ b/mjit.h
@@ -49,7 +49,7 @@ struct mjit_options { https://github.com/ruby/ruby/blob/trunk/mjit.h#L49
     bool debug;
     // Add arbitrary cflags.
     char* debug_flags;
-    // If not 0, all ISeqs are synchronously compiled. For testing.
+    // If true, all ISeqs are synchronously compiled. For testing.
     bool wait;
     // Number of calls to trigger JIT compilation. For testing.
     unsigned int min_calls;
@@ -59,6 +59,8 @@ struct mjit_options { https://github.com/ruby/ruby/blob/trunk/mjit.h#L59
     // Maximal permitted number of iseq JIT codes in a MJIT memory
     // cache.
     int max_cache_size;
+    // [experimental] If true, do not start MJIT until MJIT.resume is called.
+    bool pause;
 };
 
 // State of optimization switches
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]