ruby-changes:28709
From: ko1 <ko1@a...>
Date: Wed, 15 May 2013 17:08:06 +0900 (JST)
Subject: [ruby-changes:28709] ko1:r40761 (trunk): * gc.c: add an additional RGENGC_PROFILE mode (2).
ko1 2013-05-15 17:07:30 +0900 (Wed, 15 May 2013) New Revision: 40761 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=40761 Log: * gc.c: add an additional RGENGC_PROFILE mode (2). Profiling result can be check by GC.stat. * gc.c (type_name): separate from obj_type_name(). Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 40760) +++ ChangeLog (revision 40761) @@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed May 15 17:04:11 2013 Koichi Sasada <ko1@a...> + + * gc.c: add an additional RGENGC_PROFILE mode (2). + Profiling result can be check by GC.stat. + + * gc.c (type_name): separate from obj_type_name(). + Wed May 15 16:58:24 2013 Nobuyoshi Nakada <nobu@r...> * configure.in: save configured load path values into verconf.in. Index: gc.c =================================================================== --- gc.c (revision 40760) +++ gc.c (revision 40761) @@ -109,14 +109,19 @@ static ruby_gc_params_t initial_params = https://github.com/ruby/ruby/blob/trunk/gc.c#L109 #endif /* RGENGC_CHECK_MODE - * 0: - * 1: enable assertions + * 0: disable all assertions + * 1: enable assertions (to debug RGenGC) * 2: enable bits check (for debugging) */ #ifndef RGENGC_CHECK_MODE #define RGENGC_CHECK_MODE 0 #endif +/* RGENGC_PROFILE + * 0: disable RGenGC profiling + * 1: enable profiling for basic information + * 2: enable profiling for each types + */ #ifndef RGENGC_PROFILE #define RGENGC_PROFILE 0 #endif @@ -297,6 +302,9 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L302 size_t shade_operation_count; size_t remembered_sunny_object_count; size_t remembered_shady_object_count; +#if RGENGC_PROFILE >= 2 + size_t generated_shady_object_count_types[RUBY_T_MASK]; +#endif #endif /* RGENGC_PROFILE */ #endif /* USE_RGENGC */ @@ -801,7 +809,12 @@ newobj(VALUE klass, VALUE flags) https://github.com/ruby/ruby/blob/trunk/gc.c#L809 #if RGENGC_PROFILE if (flags & FL_WB_PROTECTED) objspace->profile.generated_sunny_object_count++; - else objspace->profile.generated_shady_object_count++; + else { + objspace->profile.generated_shady_object_count++; +#if RGENGC_PROFILE >= 2 + objspace->profile.generated_shady_object_count_types[BUILTIN_TYPE(obj)]++; +#endif + } #endif MEMZERO((void*)obj, RVALUE, 1); @@ -2824,9 +2837,9 @@ rb_objspace_markable_object_p(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L2837 } static const char * -obj_type_name(VALUE obj) +type_name(int type, VALUE obj) { - switch (TYPE(obj)) { + switch (type) { #define TYPE_NAME(t) case (t): return #t; TYPE_NAME(T_NONE); TYPE_NAME(T_OBJECT); @@ -2853,7 +2866,7 @@ obj_type_name(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L2866 TYPE_NAME(T_ICLASS); TYPE_NAME(T_ZOMBIE); case T_DATA: - if (rb_objspace_data_type_name(obj)) { + if (obj && rb_objspace_data_type_name(obj)) { return rb_objspace_data_type_name(obj); } return "T_DATA"; @@ -2862,6 +2875,12 @@ obj_type_name(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L2875 return "unknown"; } +static const char * +obj_type_name(VALUE obj) +{ + return type_name(TYPE(obj), obj); +} + static void rgengc_check_shady(rb_objspace_t *objspace, VALUE obj) { @@ -3874,6 +3893,17 @@ gc_stat(int argc, VALUE *argv, VALUE sel https://github.com/ruby/ruby/blob/trunk/gc.c#L3893 rb_hash_aset(hash, sym_shade_operation_count, SIZET2NUM(objspace->profile.shade_operation_count)); rb_hash_aset(hash, sym_remembered_sunny_object_count, SIZET2NUM(objspace->profile.remembered_sunny_object_count)); rb_hash_aset(hash, sym_remembered_shady_object_count, SIZET2NUM(objspace->profile.remembered_shady_object_count)); +#if RGENGC_PROFILE >= 2 + { + VALUE types = rb_hash_new(); + int i; + for (i=0; i<T_MASK; i++) { + const char *type = type_name(i, 0); + rb_hash_aset(types, ID2SYM(rb_intern(type)), SIZET2NUM(objspace->profile.generated_shady_object_count_types[i])); + } + rb_hash_aset(hash, ID2SYM(rb_intern("generated_shady_object_count_types")), types); + } +#endif #endif /* RGENGC_PROFILE */ #endif /* USE_RGENGC */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/