aboutsummaryrefslogtreecommitdiffstats
path: root/vm_core.h
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2021-01-04 18:08:25 +0900
committerKoichi Sasada <ko1@atdot.net>2021-01-05 02:27:58 +0900
commite7fc353f044f9280222ca41b029b1368d2bf2fe3 (patch)
tree3e3a8e464dbc3767d5b71f17675d3f0dba6ac43f /vm_core.h
parentbf21faec1521540f2be05df400c37600b4316a0f (diff)
downloadruby-e7fc353f044f9280222ca41b029b1368d2bf2fe3.tar.gz
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.
Diffstat (limited to 'vm_core.h')
-rw-r--r--vm_core.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/vm_core.h b/vm_core.h
index f6b81b57c6..cfce3af59d 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -218,10 +218,18 @@ struct rb_control_frame_struct;
/* iseq data type */
typedef struct rb_compile_option_struct rb_compile_option_t;
-struct iseq_inline_cache_entry {
- rb_serial_t ic_serial;
- const rb_cref_t *ic_cref;
- VALUE value;
+// imemo_constcache
+struct iseq_inline_constant_cache_entry {
+ VALUE flags;
+
+ VALUE value; // v0
+ const rb_cref_t *ic_cref; // v1
+ rb_serial_t ic_serial; // v2
+ // v3
+};
+
+struct iseq_inline_constant_cache {
+ struct iseq_inline_constant_cache_entry *entry;
};
struct iseq_inline_iv_cache_entry {
@@ -233,7 +241,7 @@ union iseq_inline_storage_entry {
struct rb_thread_struct *running_thread;
VALUE value;
} once;
- struct iseq_inline_cache_entry cache;
+ struct iseq_inline_constant_cache ic_cache;
struct iseq_inline_iv_cache_entry iv_cache;
};
@@ -1126,7 +1134,7 @@ enum vm_svar_index {
};
/* inline cache */
-typedef struct iseq_inline_cache_entry *IC;
+typedef struct iseq_inline_constant_cache *IC;
typedef struct iseq_inline_iv_cache_entry *IVC;
typedef union iseq_inline_storage_entry *ISE;
typedef const struct rb_callinfo *CALL_INFO;