diff --git a/mjit.c b/mjit.c index 97af05d466..02fb5ea7fc 100644 --- a/mjit.c +++ b/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) {