diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2020-07-20 15:38:07 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2020-07-20 20:20:08 -0400 |
commit | 73ee1295a33c51f24e774b273fdeca5910ce5ba8 (patch) | |
tree | bd0fb8ba3c90a28c4234eb6ad6ebe568fbb71b56 | |
parent | ac3dbbd4db20ec225cb579eb0293900fbc517d53 (diff) | |
download | ruby-73ee1295a33c51f24e774b273fdeca5910ce5ba8.tar.gz |
Add memsize support for the call cache table
Each class/module/iclass can potentially have their own cc table.
Count their malloc usage.
-rw-r--r-- | gc.c | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -3898,6 +3898,24 @@ rb_obj_id(VALUE obj) return rb_find_object_id(obj, cached_object_id); } +static enum rb_id_table_iterator_result +cc_table_memsize_i(VALUE ccs_ptr, void *data_ptr) +{ + size_t *total_size = data_ptr; + struct rb_class_cc_entries *ccs = (struct rb_class_cc_entries *)ccs_ptr; + *total_size += sizeof(*ccs); + *total_size += sizeof(ccs->entries[0]) * ccs->capa; + return ID_TABLE_CONTINUE; +} + +static size_t +cc_table_memsize(struct rb_id_table *cc_table) +{ + size_t total = rb_id_table_memsize(cc_table); + rb_id_table_foreach_values(cc_table, cc_table_memsize_i, &total); + return total; +} + static size_t obj_memsize_of(VALUE obj, int use_all_types) { @@ -3936,6 +3954,9 @@ obj_memsize_of(VALUE obj, int use_all_types) if (RCLASS(obj)->ptr->const_tbl) { size += rb_id_table_memsize(RCLASS(obj)->ptr->const_tbl); } + if (RCLASS_CC_TBL(obj)) { + size += cc_table_memsize(RCLASS_CC_TBL(obj)); + } size += sizeof(rb_classext_t); } break; @@ -3946,6 +3967,9 @@ obj_memsize_of(VALUE obj, int use_all_types) size += rb_id_table_memsize(RCLASS_M_TBL(obj)); } } + if (RCLASS_EXT(obj) && RCLASS_CC_TBL(obj)) { + size += cc_table_memsize(RCLASS_CC_TBL(obj)); + } break; case T_STRING: size += rb_str_memsize(obj); |