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

ruby-changes:33452

From: ko1 <ko1@a...>
Date: Tue, 8 Apr 2014 22:36:08 +0900 (JST)
Subject: [ruby-changes:33452] ko1:r45531 (trunk): * gc.c: rename `RGENGC_THREEGEN' to `RGENGC_AGE2_PROMOTION'.

ko1	2014-04-08 22:36:02 +0900 (Tue, 08 Apr 2014)

  New Revision: 45531

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=45531

  Log:
    * gc.c: rename `RGENGC_THREEGEN' to `RGENGC_AGE2_PROMOTION'.
    * gc.c (rgengc_rememberset_mark): don't promote, but remain in
      remember set for infant objects.
    * gc.c (RVALUE_PROMOTE_INFANT, RVALUE_PROMOTE_YOUNG): count numbers
      in these functions.

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 45530)
+++ ChangeLog	(revision 45531)
@@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Apr  8 22:31:44 2014  Koichi Sasada  <ko1@a...>
+
+	* gc.c: rename `RGENGC_THREEGEN' to `RGENGC_AGE2_PROMOTION'.
+
+	* gc.c (rgengc_rememberset_mark): don't promote, but remain in
+	  remember set for infant objects.
+
+	* gc.c (RVALUE_PROMOTE_INFANT, RVALUE_PROMOTE_YOUNG): count numbers
+	  in these functions.
+
 Mon Apr  7 21:11:49 2014  Tanaka Akira  <akr@f...>
 
 	* ext/socket/socket.c (sock_s_getnameinfo): Save errno for EAI_SYSTEM.
Index: gc.c
===================================================================
--- gc.c	(revision 45530)
+++ gc.c	(revision 45531)
@@ -209,13 +209,13 @@ static ruby_gc_params_t gc_params = { https://github.com/ruby/ruby/blob/trunk/gc.c#L209
 #define RGENGC_PROFILE     0
 #endif
 
-/* RGENGC_THREEGEN
- * Enable/disable three gen GC.
+/* RGENGC_AGE2_PROMOTION
+ * Enable/disable age2 promotion strategy
  * 0: Infant gen -> Old gen
  * 1: Infant gen -> Young -> Old gen
  */
-#ifndef RGENGC_THREEGEN
-#define RGENGC_THREEGEN    0
+#ifndef RGENGC_AGE2_PROMOTION
+#define RGENGC_AGE2_PROMOTION 0
 #endif
 
 /* RGENGC_ESTIMATE_OLDMALLOC
@@ -233,7 +233,7 @@ static ruby_gc_params_t gc_params = { https://github.com/ruby/ruby/blob/trunk/gc.c#L233
 #define RGENGC_DEBUG       0
 #define RGENGC_CHECK_MODE  0
 #define RGENGC_PROFILE     0
-#define RGENGC_THREEGEN    0
+#define RGENGC_AGE2_PROMOTION    0
 #define RGENGC_ESTIMATE_OLDMALLOC 0
 
 #endif /* USE_RGENGC */
@@ -478,7 +478,7 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L478
 	size_t generated_shady_object_count;
 	size_t shade_operation_count;
 	size_t promote_infant_count;
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	size_t promote_young_count;
 #endif
 	size_t remembered_normal_object_count;
@@ -489,7 +489,7 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L489
 	size_t generated_shady_object_count_types[RUBY_T_MASK];
 	size_t shade_operation_count_types[RUBY_T_MASK];
 	size_t promote_infant_types[RUBY_T_MASK];
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	size_t promote_young_types[RUBY_T_MASK];
 #endif
 	size_t remembered_normal_object_count_types[RUBY_T_MASK];
@@ -528,7 +528,7 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L528
 	size_t remembered_shady_object_limit;
 	size_t old_object_count;
 	size_t old_object_limit;
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	size_t young_object_count;
 #endif
 
@@ -735,7 +735,7 @@ check_gen_consistency(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L735
 		rb_bug("check_gen_consistency: %p (%s) is not WB protected, but %s object.", (void *)obj, obj_type_name(obj), type);
 	    }
 
-#if !RGENGC_THREEGEN
+#if !RGENGC_AGE2_PROMOTION
 	    if (!old_flag) {
 		rb_bug("check_gen_consistency: %p (%s) is not infant, but is not old (on 2gen).", (void *)obj, obj_type_name(obj));
 	    }
@@ -772,7 +772,7 @@ static inline VALUE https://github.com/ruby/ruby/blob/trunk/gc.c#L772
 RVALUE_OLD_P(VALUE obj)
 {
     check_gen_consistency(obj);
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     return FL_TEST2(obj, FL_PROMOTED) && RVALUE_OLD_BITMAP_P(obj);
 #else
     return FL_TEST2(obj, FL_PROMOTED);
@@ -787,14 +787,25 @@ RVALUE_PROMOTED_P(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L787
 }
 
 static inline void
-RVALUE_PROMOTE_INFANT(VALUE obj)
+RVALUE_PROMOTE_INFANT(rb_objspace_t *objspace, VALUE obj)
 {
     check_gen_consistency(obj);
+
     if (RGENGC_CHECK_MODE && !RVALUE_INFANT_P(obj)) rb_bug("RVALUE_PROMOTE_INFANT: %p (%s) is not infant object.", (void *)obj, obj_type_name(obj));
     FL_SET2(obj, FL_PROMOTED);
-#if !RGENGC_THREEGEN
+
+#if RGENGC_AGE2_PROMOTION
+    /* infant -> young */
+    objspace->rgengc.young_object_count++;
+#else
+    /* infant -> old */
+    objspace->rgengc.old_object_count++;
+#endif
+
+#if !RGENGC_AGE2_PROMOTION
     MARK_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj);
 #endif
+
     check_gen_consistency(obj);
 
 #if RGENGC_PROFILE >= 1
@@ -809,10 +820,10 @@ RVALUE_PROMOTE_INFANT(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L820
 #endif
 }
 
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 /*
- * Two gen: Infant -> Old.
- * Three gen: Infant -> Young -> Old.
+ * Age1 promotion: Infant (0) -> Old (1 and later).
+ * Age2 promotion: Infant (0) -> Young (1) -> Old (2 and later).
  */
 static inline VALUE
 RVALUE_YOUNG_P(VALUE obj)
@@ -822,11 +833,14 @@ RVALUE_YOUNG_P(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L833
 }
 
 static inline void
-RVALUE_PROMOTE_YOUNG(VALUE obj)
+RVALUE_PROMOTE_YOUNG(rb_objspace_t *objspace, VALUE obj)
 {
     check_gen_consistency(obj);
+
     if (RGENGC_CHECK_MODE && !RVALUE_YOUNG_P(obj)) rb_bug("RVALUE_PROMOTE_YOUNG: %p (%s) is not young object.", (void *)obj, obj_type_name(obj));
     MARK_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj);
+    objspace->rgengc.old_object_count++;
+
     check_gen_consistency(obj);
 
 #if RGENGC_PROFILE >= 1
@@ -2996,7 +3010,7 @@ gc_after_sweep(rb_objspace_t *objspace) https://github.com/ruby/ruby/blob/trunk/gc.c#L3010
 		(int)objspace->profile.major_gc_count,
 		(int)objspace->profile.minor_gc_count,
 		(int)objspace->profile.promote_infant_count,
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 		(int)objspace->profile.promote_young_count,
 #else
 		0,
@@ -3571,7 +3585,7 @@ rgengc_check_relation(rb_objspace_t *obj https://github.com/ruby/ruby/blob/trunk/gc.c#L3585
 		objspace->rgengc.remembered_shady_object_count++;
 	    }
 	}
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	else {
 	    if (gc_marked(objspace, obj)) {
 		if (!RVALUE_OLD_P(obj)) {
@@ -3581,7 +3595,7 @@ rgengc_check_relation(rb_objspace_t *obj https://github.com/ruby/ruby/blob/trunk/gc.c#L3595
 	    }
 	    else {
 		if (RVALUE_INFANT_P(obj)) {
-		    RVALUE_PROMOTE_INFANT(obj);
+		    RVALUE_PROMOTE_INFANT(objspace, obj);
 		}
 	    }
 	}
@@ -3665,14 +3679,10 @@ gc_mark_children(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L3679
 	if (RVALUE_WB_PROTECTED(obj)) {
 	    if (RVALUE_INFANT_P((VALUE)obj)) {
 		/* infant -> young */
-		RVALUE_PROMOTE_INFANT((VALUE)obj);
-#if RGENGC_THREEGEN
-		/* infant -> young */
-		objspace->rgengc.young_object_count++;
+		RVALUE_PROMOTE_INFANT(objspace, (VALUE)obj);
+#if RGENGC_AGE2_PROMOTION
 		objspace->rgengc.parent_object_is_old = FALSE;
 #else
-		/* infant -> old */
-		objspace->rgengc.old_object_count++;
 		objspace->rgengc.parent_object_is_old = TRUE;
 #endif
 		rgengc_report(3, objspace, "gc_mark_children: promote infant -> young %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
@@ -3680,11 +3690,10 @@ gc_mark_children(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L3690
 	    else {
 		objspace->rgengc.parent_object_is_old = TRUE;
 
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 		if (RVALUE_YOUNG_P((VALUE)obj)) {
 		    /* young -> old */
-		    RVALUE_PROMOTE_YOUNG((VALUE)obj);
-		    objspace->rgengc.old_object_count++;
+		    RVALUE_PROMOTE_YOUNG(objspace, (VALUE)obj);
 		    rgengc_report(3, objspace, "gc_mark_children: promote young -> old %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
 		}
 		else {
@@ -3693,7 +3702,7 @@ gc_mark_children(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L3702
 			/* major/full GC */
 			objspace->rgengc.old_object_count++;
 		    }
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 		}
 #endif
 	    }
@@ -4523,7 +4532,7 @@ gc_marks(rb_objspace_t *objspace, int fu https://github.com/ruby/ruby/blob/trunk/gc.c#L4532
 	if (full_mark == TRUE) { /* major/full GC */
 	    objspace->rgengc.remembered_shady_object_count = 0;
 	    objspace->rgengc.old_object_count = 0;
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	    objspace->rgengc.young_object_count = 0;
 #endif
 
@@ -4691,11 +4700,18 @@ rgengc_rememberset_mark(rb_objspace_t *o https://github.com/ruby/ruby/blob/trunk/gc.c#L4700
 
 			if (RVALUE_WB_PROTECTED(p)) {
 			    rgengc_report(2, objspace, "rgengc_rememberset_mark: clear %p (%s)\n", p, obj_type_name((VALUE)p));
-#if RGENGC_THREEGEN
-			    if (RVALUE_INFANT_P((VALUE)p)) RVALUE_PROMOTE_INFANT((VALUE)p);
-			    if (RVALUE_YOUNG_P((VALUE)p)) RVALUE_PROMOTE_YOUNG((VALUE)p);
-#endif
+#if RGENGC_AGE2_PROMOTION
+			    if (RVALUE_INFANT_P((VALUE)p)) {
+				/* infant objects should remain in remembered because remembered objects should become old objects */
+				/* young objects become old objects soon */
+			    }
+			    else {
+				CLEAR_IN_BITMAP(bits, p);
+			    }
+#else
 			    CLEAR_IN_BITMAP(bits, p);
+#endif
+
 #if RGENGC_PROFILE > 0
 			    clear_count++;
 #endif
@@ -4798,7 +4814,7 @@ rb_gc_writebarrier_unprotect_promoted(VA https://github.com/ruby/ruby/blob/trunk/gc.c#L4814
 #endif /* RGENGC_PROFILE >= 2 */
 #endif /* RGENGC_PROFILE */
     }
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     else {
 	RVALUE_DEMOTE_FROM_YOUNG(obj);
     }
@@ -4878,7 +4894,7 @@ rb_obj_gc_flags(VALUE obj, ID* flags, si https://github.com/ruby/ruby/blob/trunk/gc.c#L4894
     static ID ID_marked;
 #if USE_RGENGC
     static ID ID_wb_protected, ID_old, ID_remembered;
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     static ID ID_young, ID_infant;
 #endif
 #endif
@@ -4890,7 +4906,7 @@ rb_obj_gc_flags(VALUE obj, ID* flags, si https://github.com/ruby/ruby/blob/trunk/gc.c#L4906
 	I(wb_protected);
 	I(old);
 	I(remembered);
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	I(young);
 	I(infant);
 #endif
@@ -4903,7 +4919,7 @@ rb_obj_gc_flags(VALUE obj, ID* flags, si https://github.com/ruby/ruby/blob/trunk/gc.c#L4919
 	flags[n++] = ID_wb_protected;
     if (RVALUE_OLD_P(obj) && n<max)
 	flags[n++] = ID_old;
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     if (RVALUE_YOUNG_P(obj) && n<max)
 	flags[n++] = ID_young;
     if (RVALUE_INFANT_P(obj) && n<max)
@@ -5488,7 +5504,7 @@ gc_stat_internal(VALUE hash_or_sym, size https://github.com/ruby/ruby/blob/trunk/gc.c#L5504
     SET(generated_shady_object_count, objspace->profile.generated_shady_object_count);
     SET(shade_operation_count, objspace->profile.shade_operation_count);
     SET(promote_infant_count, objspace->profile.promote_infant_count);
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     SET(promote_young_count, objspace->profile.promote_young_count);
 #endif
     SET(remembered_normal_object_count, objspace->profile.remembered_normal_object_count);
@@ -5507,7 +5523,7 @@ gc_stat_internal(VALUE hash_or_sym, size https://github.com/ruby/ruby/blob/trunk/gc.c#L5523
 	gc_count_add_each_types(hash, "generated_shady_object_count_types", objspace->profile.generated_shady_object_count_types);
 	gc_count_add_each_types(hash, "shade_operation_count_types", objspace->profile.shade_operation_count_types);
 	gc_count_add_each_types(hash, "promote_infant_types", objspace->profile.promote_infant_types);
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
 	gc_count_add_each_types(hash, "promote_young_types", objspace->profile.promote_young_types);
 #endif
 	gc_count_add_each_types(hash, "remembered_normal_object_count_types", objspace->profile.remembered_normal_object_count_types);
@@ -7445,7 +7461,7 @@ rb_gcdebug_print_obj_condition(VALUE obj https://github.com/ruby/ruby/blob/trunk/gc.c#L7461
 
     fprintf(stderr, "marked?      : %s\n", MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj) ? "true" : "false");
 #if USE_RGENGC
-#if RGENGC_THREEGEN
+#if RGENGC_AGE2_PROMOTION
     fprintf(stderr, "young?       : %s\n", RVALUE_YOUNG_P(obj) ? "true" : "false");
 #endif
     fprintf(stderr, "old?         : %s\n", RVALUE_OLD_P(obj) ? "true" : "false");
@@ -7631,7 +7647,7 @@ Init_GC(void) https://github.com/ruby/ruby/blob/trunk/gc.c#L7647
 	OPT(RGENGC_DEBUG);
 	OPT(RGENGC_CHECK_MODE);
 	OPT(RGENGC_PROFILE);
-	OPT(RGENGC_THREEGEN);
+	OPT(RGENGC_AGE2_PROMOTION);
 	OPT(RGENGC_ESTIMATE_OLDMALLOC);
 	OPT(GC_PROFILE_MORE_DETAIL);
 	OPT(GC_ENABLE_LAZY_SWEEP);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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