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;
|
mjit_call_p = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
rb_mjit_cme_invalidate(rb_callable_method_entry_t *cme)
|
mjit_cme_invalidate(void *data)
|
||||||
{
|
{
|
||||||
if (!mjit_enabled || !mjit_call_p || !rb_mMJITHooks) return;
|
if (!mjit_enabled || !mjit_call_p || !rb_mMJITHooks) return;
|
||||||
|
rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)data;
|
||||||
WITH_MJIT_DISABLED({
|
WITH_MJIT_DISABLED({
|
||||||
VALUE cme_klass = rb_funcall(rb_mMJITC, rb_intern("rb_callable_method_entry_struct"), 0);
|
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));
|
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
|
void
|
||||||
rb_mjit_before_ractor_spawn(void)
|
rb_mjit_before_ractor_spawn(void)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user