From e7fc353f044f9280222ca41b029b1368d2bf2fe3 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Mon, 4 Jan 2021 18:08:25 +0900 Subject: enable constant cache on ractors constant cache `IC` is accessed by non-atomic manner and there are thread-safety issues, so Ruby 3.0 disables to use const cache on non-main ractors. This patch enables it by introducing `imemo_constcache` and allocates it by every re-fill of const cache like `imemo_callcache`. [Bug #17510] Now `IC` only has one entry `IC::entry` and it points to `iseq_inline_constant_cache_entry`, managed by T_IMEMO object. `IC` is atomic data structure so `rb_mjit_before_vm_ic_update()` and `rb_mjit_after_vm_ic_update()` is not needed. --- insns.def | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'insns.def') diff --git a/insns.def b/insns.def index 73a07e4576..e3c7ad5e7b 100644 --- a/insns.def +++ b/insns.def @@ -1023,9 +1023,10 @@ opt_getinlinecache () (VALUE val) { - if (vm_ic_hit_p(ic->ic_serial, ic->ic_cref, GET_EP())) { - val = ic->value; - JUMP(dst); + struct iseq_inline_constant_cache_entry *ice = ic->entry; + if (ice && vm_ic_hit_p(ice, GET_EP())) { + val = ice->value; + JUMP(dst); } else { val = Qnil; @@ -1039,7 +1040,7 @@ opt_setinlinecache (VALUE val) (VALUE val) { - vm_ic_update(ic, val, GET_EP()); + vm_ic_update(GET_ISEQ(), ic, val, GET_EP()); } /* run iseq only once */ -- cgit v1.2.3