aboutsummaryrefslogtreecommitdiffstats
path: root/cont.c
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-02-28 23:58:33 -0800
committerGitHub <noreply@github.com>2020-02-28 23:58:33 -0800
commitadcf0316d1ecedae2a9157ad941550e0c0fb510b (patch)
treeb9fc854a840690799088e00677c62fc0beb96a96 /cont.c
parenta8dcab723316997d9e01c89d6df969edce75bdca (diff)
downloadruby-adcf0316d1ecedae2a9157ad941550e0c0fb510b.tar.gz
Prevent unloading methods used in root_fiber while calling another Fiber (#2939)
Fixing SEGVs like: http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2744905 http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2744420 http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2741400
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/cont.c b/cont.c
index df197a7363..7a32573942 100644
--- a/cont.c
+++ b/cont.c
@@ -1104,6 +1104,15 @@ cont_save_thread(rb_context_t *cont, rb_thread_t *th)
}
static void
+cont_init_mjit_cont(rb_context_t *cont)
+{
+ VM_ASSERT(cont->mjit_cont == NULL);
+ if (mjit_enabled) {
+ cont->mjit_cont = mjit_cont_new(&(cont->saved_ec));
+ }
+}
+
+static void
cont_init(rb_context_t *cont, rb_thread_t *th)
{
/* save thread context */
@@ -1112,9 +1121,7 @@ cont_init(rb_context_t *cont, rb_thread_t *th)
cont->saved_ec.local_storage = NULL;
cont->saved_ec.local_storage_recursive_hash = Qnil;
cont->saved_ec.local_storage_recursive_hash_for_trace = Qnil;
- if (mjit_enabled) {
- cont->mjit_cont = mjit_cont_new(&cont->saved_ec);
- }
+ cont_init_mjit_cont(cont);
}
static rb_context_t *
@@ -1131,6 +1138,14 @@ cont_new(VALUE klass)
return cont;
}
+void
+rb_fiber_init_mjit_cont(struct rb_fiber_struct *fiber)
+{
+ // Currently this function is meant for root_fiber. Others go through cont_new.
+ // XXX: Is this mjit_cont `mjit_cont_free`d?
+ cont_init_mjit_cont(&fiber->cont);
+}
+
#if 0
void
show_vm_stack(const rb_execution_context_t *ec)