summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--gc.c22
2 files changed, 33 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 00cf2e834c..4c8e75538d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Mon May 12 19:52:11 2014 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: count young object correctly and show it in GC.stat
+ on RGENGC_AGE2_PROMOTION.
+
+ * gc.c (RVALUE_PROMOTE_YOUNG): decrement young object count on
+ YOUNG->OLD.
+
+ * gc.c (obj_free): decrement young object count when young object
+ freed.
+
+ * gc.c (gc_marks): should not clear young object count.
+
+ * gc.c (gc_stat_internal): GC.stat :young_object information.
+
Mon May 12 01:30:59 2014 Tanaka Akira <akr@fsij.org>
* ext/socket/ifaddr.c (IS_IFADDRS): Unused macro removed.
diff --git a/gc.c b/gc.c
index 2d1aee740b..b0c3bb278e 100644
--- a/gc.c
+++ b/gc.c
@@ -844,6 +844,8 @@ RVALUE_PROMOTE_YOUNG(rb_objspace_t *objspace, VALUE 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.young_object_count--;
objspace->rgengc.old_object_count++;
check_gen_consistency(obj);
@@ -1531,8 +1533,14 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
}
#if USE_RGENGC
- if (MARKED_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj),obj))
+#if RGENGC_AGE2_PROMOTION
+ if (RVALUE_YOUNG_P(obj)) {
+ objspace->rgengc.young_object_count--;
+ }
+#endif
+ if (MARKED_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj),obj)) {
CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj),obj);
+ }
#endif
switch (BUILTIN_TYPE(obj)) {
@@ -4554,9 +4562,6 @@ gc_marks(rb_objspace_t *objspace, int full_mark)
if (full_mark == TRUE) { /* major/full GC */
objspace->rgengc.remembered_shady_object_count = 0;
objspace->rgengc.old_object_count = 0;
-#if RGENGC_AGE2_PROMOTION
- objspace->rgengc.young_object_count = 0;
-#endif
gc_marks_body(objspace, TRUE);
{
@@ -5426,6 +5431,9 @@ gc_stat_internal(VALUE hash_or_sym, size_t *out)
static VALUE sym_minor_gc_count, sym_major_gc_count;
static VALUE sym_remembered_shady_object, sym_remembered_shady_object_limit;
static VALUE sym_old_object, sym_old_object_limit;
+#if RGENGC_AGE2_PROMOTION
+ static VALUE sym_young_object;
+#endif
#if RGENGC_ESTIMATE_OLDMALLOC
static VALUE sym_oldmalloc_increase, sym_oldmalloc_limit;
#endif
@@ -5469,6 +5477,9 @@ gc_stat_internal(VALUE hash_or_sym, size_t *out)
S(remembered_shady_object_limit);
S(old_object);
S(old_object_limit);
+#if RGENGC_AGE2_PROMOTION
+ S(young_object);
+#endif
#if RGENGC_ESTIMATE_OLDMALLOC
S(oldmalloc_increase);
S(oldmalloc_limit);
@@ -5515,6 +5526,9 @@ gc_stat_internal(VALUE hash_or_sym, size_t *out)
SET(remembered_shady_object_limit, objspace->rgengc.remembered_shady_object_limit);
SET(old_object, objspace->rgengc.old_object_count);
SET(old_object_limit, objspace->rgengc.old_object_limit);
+#if RGENGC_AGE2_PROMOTION
+ SET(young_object, objspace->rgengc.young_object_count);
+#endif
#if RGENGC_ESTIMATE_OLDMALLOC
SET(oldmalloc_increase, objspace->rgengc.oldmalloc_increase);
SET(oldmalloc_limit, objspace->rgengc.oldmalloc_increase_limit);