1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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
This commit is contained in:
Takashi Kokubun 2020-12-20 23:17:28 -08:00
parent 1fdc97f1b7
commit f26f905b28
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
2 changed files with 15 additions and 2 deletions

12
mjit.c
View file

@ -935,8 +935,13 @@ mjit_finish(bool close_handle_p)
verbose(1, "Successful MJIT finish");
}
// Called by rb_vm_mark() to mark active_units so that we do not GC ISeq which
// may still be referred to by mjit_recompile() or compact_all_jit_code().
// Called by rb_vm_mark().
//
// Mark an ISeq being compiled to prevent its CCs from being GC-ed, which
// an MJIT worker may concurrently see.
//
// Also mark active_units so that we do not GC ISeq which may still be
// referred to by mjit_recompile() or compact_all_jit_code().
void
mjit_mark(void)
{
@ -944,6 +949,9 @@ mjit_mark(void)
return;
RUBY_MARK_ENTER("mjit");
if (compiling_iseq != NULL)
rb_gc_mark((VALUE)compiling_iseq);
// We need to release a lock when calling rb_gc_mark to avoid doubly acquiring
// a lock by by mjit_gc_start_hook inside rb_gc_mark.
//

View file

@ -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);