Lazily invalidate cme for safety
This commit is contained in:
parent
1bdc23f35b
commit
1892ec5738
14
mjit.c
14
mjit.c
@ -331,10 +331,11 @@ rb_mjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop)
|
||||
mjit_call_p = false;
|
||||
}
|
||||
|
||||
void
|
||||
rb_mjit_cme_invalidate(rb_callable_method_entry_t *cme)
|
||||
static void
|
||||
mjit_cme_invalidate(void *data)
|
||||
{
|
||||
if (!mjit_enabled || !mjit_call_p || !rb_mMJITHooks) return;
|
||||
rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)data;
|
||||
WITH_MJIT_DISABLED({
|
||||
VALUE cme_klass = rb_funcall(rb_mMJITC, rb_intern("rb_callable_method_entry_struct"), 0);
|
||||
VALUE cme_ptr = rb_funcall(cme_klass, rb_intern("new"), 1, SIZET2NUM((size_t)cme));
|
||||
@ -342,6 +343,15 @@ rb_mjit_cme_invalidate(rb_callable_method_entry_t *cme)
|
||||
});
|
||||
}
|
||||
|
||||
void
|
||||
rb_mjit_cme_invalidate(rb_callable_method_entry_t *cme)
|
||||
{
|
||||
if (!mjit_enabled || !mjit_call_p || !rb_mMJITHooks) return;
|
||||
// Asynchronously hook the Ruby code since running Ruby in the middle of cme invalidation is dangerous.
|
||||
extern int rb_workqueue_register(unsigned flags, rb_postponed_job_func_t func, void *data);
|
||||
rb_workqueue_register(0, mjit_cme_invalidate, (void *)cme);
|
||||
}
|
||||
|
||||
void
|
||||
rb_mjit_before_ractor_spawn(void)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user