summaryrefslogtreecommitdiff
path: root/internal/class.h
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-10-16 15:20:40 +0900
committerKoichi Sasada <ko1@atdot.net>2020-10-17 08:18:04 +0900
commitf6661f50854e0cdccb03ee516a21ce62adf6c802 (patch)
tree72668d7b8a8cdbe7f84234bdd99e93a9049a7918 /internal/class.h
parent91ec5f9e39cf54dd7a157addb778293853571f13 (diff)
sync RClass::ext::iv_index_tbl
iv_index_tbl manages instance variable indexes (ID -> index). This data structure should be synchronized with other ractors so introduce some VM locks. This patch also introduced atomic ivar cache used by set/getinlinecache instructions. To make updating ivar cache (IVC), we changed iv_index_tbl data structure to manage (ID -> entry) and an entry points serial and index. IVC points to this entry so that cache update becomes atomically.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3662
Diffstat (limited to 'internal/class.h')
-rw-r--r--internal/class.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/internal/class.h b/internal/class.h
index bb12825162..eade920ff0 100644
--- a/internal/class.h
+++ b/internal/class.h
@@ -25,8 +25,14 @@ struct rb_subclass_entry {
struct rb_subclass_entry *next;
};
+struct rb_iv_index_tbl_entry {
+ uint32_t index;
+ rb_serial_t class_serial;
+ VALUE class_value;
+};
+
struct rb_classext_struct {
- struct st_table *iv_index_tbl;
+ struct st_table *iv_index_tbl; // ID -> struct rb_iv_index_tbl_entry
struct st_table *iv_tbl;
#if SIZEOF_SERIAL_T == SIZEOF_VALUE /* otherwise m_tbl is in struct RClass */
struct rb_id_table *m_tbl;