aboutsummaryrefslogtreecommitdiffstats
path: root/st.c
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 /st.c
parent91ec5f9e39cf54dd7a157addb778293853571f13 (diff)
downloadruby-f6661f50854e0cdccb03ee516a21ce62adf6c802.tar.gz
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.
Diffstat (limited to 'st.c')
-rw-r--r--st.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/st.c b/st.c
index 8be466bf73..fe7a21cf80 100644
--- a/st.c
+++ b/st.c
@@ -2238,4 +2238,19 @@ rb_hash_bulk_insert_into_st_table(long argc, const VALUE *argv, VALUE hash)
else
st_insert_generic(tab, argc, argv, hash);
}
+
+// to iterate iv_index_tbl
+st_data_t
+rb_st_nth_key(st_table *tab, st_index_t index)
+{
+ if (LIKELY(tab->entries_start == 0 &&
+ tab->num_entries == tab->entries_bound &&
+ index < tab->num_entries)) {
+ return tab->entries[index].key;
+ }
+ else {
+ rb_bug("unreachable");
+ }
+}
+
#endif