Add debug counters.
* debug_counter.h: add the following counters to measure object types. obj_free: freed count obj_str_ptr: freed count of Strings they have extra buff. obj_str_embed: freed count of Strings they don't have extra buff. obj_str_shared: freed count of Strings they have shared extra buff. obj_str_nofree: freed count of Strings they are marked as nofree. obj_str_fstr: freed count of Strings they are marked as fstr. obj_ary_ptr: freed count of Arrays they have extra buff. obj_ary_embed: freed count of Arrays they don't have extra buff. obj_obj_ptr: freed count of Objects (T_OBJECT) they have extra buff. obj_obj_embed: freed count of Objects they don't have extra buff. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58865 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
144e067007
commit
9e1624cfe8
5
array.c
5
array.c
@ -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
|
||||
|
@ -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
|
||||
|
7
gc.c
7
gc.c
@ -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:
|
||||
|
12
string.c
12
string.c
@ -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));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user