diff options
-rw-r--r-- | array.c | 5 | ||||
-rw-r--r-- | common.mk | 3 | ||||
-rw-r--r-- | debug_counter.h | 16 | ||||
-rw-r--r-- | gc.c | 7 | ||||
-rw-r--r-- | string.c | 12 |
5 files changed, 42 insertions, 1 deletions
@@ -16,6 +16,7 @@ #include "ruby/st.h" #include "probes.h" #include "id.h" +#include "debug_counter.h" #ifndef ARRAY_DEBUG # define NDEBUG @@ -553,8 +554,12 @@ void rb_ary_free(VALUE ary) { if (ARY_OWNS_HEAP_P(ary)) { + RB_DEBUG_COUNTER_INC(obj_ary_ptr); ruby_sized_xfree((void *)ARY_HEAP_PTR(ary), ARY_HEAP_SIZE(ary)); } + else { + RB_DEBUG_COUNTER_INC(obj_ary_embed); + } } RUBY_FUNC_EXPORTED size_t @@ -1303,6 +1303,7 @@ array.$(OBJEXT): $(hdrdir)/ruby/ruby.h array.$(OBJEXT): $(top_srcdir)/include/ruby.h array.$(OBJEXT): {$(VPATH)}array.c array.$(OBJEXT): {$(VPATH)}config.h +array.$(OBJEXT): {$(VPATH)}debug_counter.h array.$(OBJEXT): {$(VPATH)}defines.h array.$(OBJEXT): {$(VPATH)}encoding.h array.$(OBJEXT): {$(VPATH)}id.h @@ -1735,6 +1736,7 @@ gc.$(OBJEXT): $(top_srcdir)/include/ruby.h gc.$(OBJEXT): {$(VPATH)}config.h gc.$(OBJEXT): {$(VPATH)}constant.h gc.$(OBJEXT): {$(VPATH)}debug.h +gc.$(OBJEXT): {$(VPATH)}debug_counter.h gc.$(OBJEXT): {$(VPATH)}defines.h gc.$(OBJEXT): {$(VPATH)}encoding.h gc.$(OBJEXT): {$(VPATH)}eval_intern.h @@ -2505,6 +2507,7 @@ string.$(OBJEXT): $(top_srcdir)/include/ruby.h string.$(OBJEXT): {$(VPATH)}config.h string.$(OBJEXT): {$(VPATH)}crypt.h string.$(OBJEXT): {$(VPATH)}defines.h +string.$(OBJEXT): {$(VPATH)}debug_counter.h string.$(OBJEXT): {$(VPATH)}encindex.h string.$(OBJEXT): {$(VPATH)}encoding.h string.$(OBJEXT): {$(VPATH)}gc.h diff --git a/debug_counter.h b/debug_counter.h index be2138d3bb..250d0a568d 100644 --- a/debug_counter.h +++ b/debug_counter.h @@ -22,6 +22,7 @@ RB_DEBUG_COUNTER(mc_class_serial_miss) RB_DEBUG_COUNTER(mc_cme_complement) RB_DEBUG_COUNTER(mc_cme_complement_hit) RB_DEBUG_COUNTER(mc_search_super) + RB_DEBUG_COUNTER(ivar_get_ic_hit) RB_DEBUG_COUNTER(ivar_get_ic_miss) RB_DEBUG_COUNTER(ivar_get_ic_miss_serial) @@ -35,6 +36,21 @@ RB_DEBUG_COUNTER(ivar_set_ic_miss_oorange) RB_DEBUG_COUNTER(ivar_set_ic_miss_noobject) RB_DEBUG_COUNTER(ivar_get_base) RB_DEBUG_COUNTER(ivar_set_base) + +/* object counts */ +RB_DEBUG_COUNTER(obj_free) + +RB_DEBUG_COUNTER(obj_str_ptr) +RB_DEBUG_COUNTER(obj_str_embed) +RB_DEBUG_COUNTER(obj_str_shared) +RB_DEBUG_COUNTER(obj_str_nofree) +RB_DEBUG_COUNTER(obj_str_fstr) + +RB_DEBUG_COUNTER(obj_ary_ptr) +RB_DEBUG_COUNTER(obj_ary_embed) + +RB_DEBUG_COUNTER(obj_obj_ptr) +RB_DEBUG_COUNTER(obj_obj_embed) #endif #ifndef RUBY_DEBUG_COUNTER_H @@ -33,6 +33,7 @@ #include <setjmp.h> #include <sys/types.h> #include "ruby_assert.h" +#include "debug_counter.h" #undef rb_data_object_wrap @@ -2103,6 +2104,8 @@ make_io_zombie(rb_objspace_t *objspace, VALUE obj) static int obj_free(rb_objspace_t *objspace, VALUE obj) { + RB_DEBUG_COUNTER_INC(obj_free); + gc_event_hook(objspace, RUBY_INTERNAL_EVENT_FREEOBJ, obj); switch (BUILTIN_TYPE(obj)) { @@ -2137,6 +2140,10 @@ obj_free(rb_objspace_t *objspace, VALUE obj) if (!(RANY(obj)->as.basic.flags & ROBJECT_EMBED) && RANY(obj)->as.object.as.heap.ivptr) { xfree(RANY(obj)->as.object.as.heap.ivptr); + RB_DEBUG_COUNTER_INC(obj_obj_ptr); + } + else { + RB_DEBUG_COUNTER_INC(obj_obj_embed); } break; case T_MODULE: @@ -18,6 +18,7 @@ #include "gc.h" #include "ruby_assert.h" #include "id.h" +#include "debug_counter.h" #define BEG(no) (regs->beg[(no)]) #define END(no) (regs->end[(no)]) @@ -1310,9 +1311,18 @@ rb_str_free(VALUE str) if (FL_TEST(str, RSTRING_FSTR)) { st_data_t fstr = (st_data_t)str; st_delete(rb_vm_fstring_table(), &fstr, NULL); + RB_DEBUG_COUNTER_INC(obj_str_fstr); } - if (!STR_EMBED_P(str) && !FL_TEST(str, STR_SHARED|STR_NOFREE)) { + if (STR_EMBED_P(str)) { + RB_DEBUG_COUNTER_INC(obj_str_embed); + } + else if (FL_TEST(str, STR_SHARED | STR_NOFREE)) { + (void)RB_DEBUG_COUNTER_INC_IF(obj_str_shared, FL_TEST(str, STR_SHARED)); + (void)RB_DEBUG_COUNTER_INC_IF(obj_str_shared, FL_TEST(str, STR_NOFREE)); + } + else { + RB_DEBUG_COUNTER_INC(obj_str_ptr); ruby_sized_xfree(STR_HEAP_PTR(str), STR_HEAP_SIZE(str)); } } |