diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2020-02-28 23:58:33 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-28 23:58:33 -0800 |
commit | adcf0316d1ecedae2a9157ad941550e0c0fb510b (patch) | |
tree | b9fc854a840690799088e00677c62fc0beb96a96 /cont.c | |
parent | a8dcab723316997d9e01c89d6df969edce75bdca (diff) |
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
Notes
Notes:
Merged-By: k0kubun <takashikkbn@gmail.com>
Diffstat (limited to 'cont.c')
-rw-r--r-- | cont.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -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) |