[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]