Stop marking unit_queue
The original motivation of this marking was https://github.com/k0kubun/yarv-mjit/issues/20. As wanabe said, there are multiple options to mitigate the issue, and Eric Wong introduced another fix at 143776f6fe by checking unit->iseq inside the lock. Therefore this particular condition has been covered in two ways, and the script given by wanabe no longer crashes without mjit_mark().
This commit is contained in:
parent
74a7877836
commit
a574df14e4
27
mjit.c
27
mjit.c
@ -937,33 +937,6 @@ mjit_finish(bool close_handle_p)
|
|||||||
verbose(1, "Successful MJIT finish");
|
verbose(1, "Successful MJIT finish");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called by rb_vm_mark() to mark iseq being JIT-ed and iseqs in the unit queue.
|
|
||||||
void
|
|
||||||
mjit_mark(void)
|
|
||||||
{
|
|
||||||
if (!mjit_enabled)
|
|
||||||
return;
|
|
||||||
RUBY_MARK_ENTER("mjit");
|
|
||||||
|
|
||||||
struct rb_mjit_unit *unit = NULL;
|
|
||||||
CRITICAL_SECTION_START(4, "mjit_mark");
|
|
||||||
list_for_each(&unit_queue.head, unit, unode) {
|
|
||||||
if (unit->iseq) { // ISeq is still not GCed
|
|
||||||
VALUE iseq = (VALUE)unit->iseq;
|
|
||||||
CRITICAL_SECTION_FINISH(4, "mjit_mark rb_gc_mark");
|
|
||||||
|
|
||||||
// Don't wrap critical section with this. This may trigger GC,
|
|
||||||
// and in that case mjit_gc_start_hook causes deadlock.
|
|
||||||
rb_gc_mark(iseq);
|
|
||||||
|
|
||||||
CRITICAL_SECTION_START(4, "mjit_mark rb_gc_mark");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CRITICAL_SECTION_FINISH(4, "mjit_mark");
|
|
||||||
|
|
||||||
RUBY_MARK_LEAVE("mjit");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called by rb_iseq_mark() to mark cc_entries captured for MJIT
|
// Called by rb_iseq_mark() to mark cc_entries captured for MJIT
|
||||||
void
|
void
|
||||||
mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body)
|
mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body)
|
||||||
|
2
mjit.h
2
mjit.h
@ -98,7 +98,6 @@ extern void mjit_gc_start_hook(void);
|
|||||||
extern void mjit_gc_exit_hook(void);
|
extern void mjit_gc_exit_hook(void);
|
||||||
extern void mjit_free_iseq(const rb_iseq_t *iseq);
|
extern void mjit_free_iseq(const rb_iseq_t *iseq);
|
||||||
extern void mjit_update_references(const rb_iseq_t *iseq);
|
extern void mjit_update_references(const rb_iseq_t *iseq);
|
||||||
extern void mjit_mark(void);
|
|
||||||
extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec);
|
extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec);
|
||||||
extern void mjit_cont_free(struct mjit_cont *cont);
|
extern void mjit_cont_free(struct mjit_cont *cont);
|
||||||
extern void mjit_add_class_serial(rb_serial_t class_serial);
|
extern void mjit_add_class_serial(rb_serial_t class_serial);
|
||||||
@ -201,7 +200,6 @@ static inline void mjit_cont_free(struct mjit_cont *cont){}
|
|||||||
static inline void mjit_gc_start_hook(void){}
|
static inline void mjit_gc_start_hook(void){}
|
||||||
static inline void mjit_gc_exit_hook(void){}
|
static inline void mjit_gc_exit_hook(void){}
|
||||||
static inline void mjit_free_iseq(const rb_iseq_t *iseq){}
|
static inline void mjit_free_iseq(const rb_iseq_t *iseq){}
|
||||||
static inline void mjit_mark(void){}
|
|
||||||
static inline void mjit_add_class_serial(rb_serial_t class_serial){}
|
static inline void mjit_add_class_serial(rb_serial_t class_serial){}
|
||||||
static inline void mjit_remove_class_serial(rb_serial_t class_serial){}
|
static inline void mjit_remove_class_serial(rb_serial_t class_serial){}
|
||||||
static inline VALUE mjit_exec(rb_execution_context_t *ec) { return Qundef; /* unreachable */ }
|
static inline VALUE mjit_exec(rb_execution_context_t *ec) { return Qundef; /* unreachable */ }
|
||||||
|
2
vm.c
2
vm.c
@ -2594,8 +2594,6 @@ rb_vm_mark(void *ptr)
|
|||||||
rb_gc_mark_values(RUBY_NSIG, vm->trap_list.cmd);
|
rb_gc_mark_values(RUBY_NSIG, vm->trap_list.cmd);
|
||||||
|
|
||||||
rb_id_table_foreach_values(vm->negative_cme_table, vm_mark_negative_cme, NULL);
|
rb_id_table_foreach_values(vm->negative_cme_table, vm_mark_negative_cme, NULL);
|
||||||
|
|
||||||
mjit_mark();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RUBY_MARK_LEAVE("vm");
|
RUBY_MARK_LEAVE("vm");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user