summaryrefslogtreecommitdiff
path: root/mjit_worker.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-12-20 23:17:28 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2020-12-20 23:17:37 -0800
commitf26f905b28c5531c78445ac15d74ca1265eff5c5 (patch)
treebe3e9e5ae12d1309aeb578a739e3c23741209da6 /mjit_worker.c
parent1fdc97f1b76b7532d011b20d52f843a2bb0d1a2f (diff)
Mark an ISeq being JIT-ed
This is to avoid SEGV on a CC reference in a normal compilation https://github.com/ruby/ruby/runs/1586578023
Diffstat (limited to 'mjit_worker.c')
-rw-r--r--mjit_worker.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/mjit_worker.c b/mjit_worker.c
index 2096ea7bda..ba90cca7b6 100644
--- a/mjit_worker.c
+++ b/mjit_worker.c
@@ -1103,6 +1103,8 @@ compile_prelude(FILE *f)
#endif
}
+static rb_iseq_t *compiling_iseq = NULL;
+
// Compile ISeq in UNIT and return function pointer of JIT-ed code.
// It may return NOT_COMPILED_JIT_ISEQ_FUNC if something went wrong.
static mjit_func_t
@@ -1136,6 +1138,8 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
}
// We need to check again here because we could've waited on GC above
in_jit = (unit->iseq != NULL);
+ if (in_jit)
+ compiling_iseq = unit->iseq;
CRITICAL_SECTION_FINISH(3, "before mjit_compile to wait GC finish");
if (!in_jit) {
fclose(f);
@@ -1160,6 +1164,7 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
// release blocking mjit_gc_start_hook
CRITICAL_SECTION_START(3, "after mjit_compile to wakeup client for GC");
+ compiling_iseq = NULL;
in_jit = false;
verbose(3, "Sending wakeup signal to client in a mjit-worker for GC");
rb_native_cond_signal(&mjit_client_wakeup);