summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-21 22:29:09 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-21 22:29:09 +0000
commita59e629868a72b4fb71a5b4930191337264b82e2 (patch)
treed50e526c4a0ccfe5e4a16c11098c868aad005ff5 /gc.c
parentdbd8f3ac03428d5577405344885abb64d5020bc3 (diff)
* gc.c (gc_prof_set_heap_info, after_gc_sweep): call
gc_prof_set_heap_info() just after sweeping to calculate live object number correctly. (live object number = total generated number (before marking) - total freed number (after sweeping)) * gc.c (gc_marks): record `oldgen_object_count' into current profile` record directly. * gc.c (rgengc_rememberset_mark): same for remembered_normal_objects and remembered_shady_objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/gc.c b/gc.c
index 5d747c3a98..048360d70b 100644
--- a/gc.c
+++ b/gc.c
@@ -350,9 +350,6 @@ typedef struct rb_objspace {
size_t remembered_normal_object_count;
size_t remembered_shady_object_count;
- /* temporal profiling space */
- size_t remembered_normal_objects;
- size_t remembered_shady_objects;
#if RGENGC_PROFILE >= 2
size_t generated_normal_object_count_types[RUBY_T_MASK];
size_t generated_shady_object_count_types[RUBY_T_MASK];
@@ -532,6 +529,8 @@ static inline void gc_prof_mark_timer_stop(rb_objspace_t *);
static inline void gc_prof_sweep_timer_start(rb_objspace_t *);
static inline void gc_prof_sweep_timer_stop(rb_objspace_t *);
static inline void gc_prof_set_malloc_info(rb_objspace_t *);
+static inline void gc_prof_set_heap_info(rb_objspace_t *);
+
#define gc_prof_record(objspace) (objspace)->profile.current_record
static const char *obj_type_name(VALUE obj);
@@ -2320,10 +2319,7 @@ after_gc_sweep(rb_objspace_t *objspace)
{
size_t inc;
- rgengc_report(1, objspace, "after_gc_sweep\n");
-
- gc_prof_set_malloc_info(objspace);
- rgengc_report(5, objspace, "after_gc_sweep: objspace->heap.free_num: %d, objspace->heap.free_min: %d\n",
+ rgengc_report(1, objspace, "after_gc_sweep: objspace->heap.free_num: %d, objspace->heap.free_min: %d\n",
objspace->heap.free_num, objspace->heap.free_min);
if (objspace->heap.free_num < objspace->heap.free_min) {
@@ -2350,6 +2346,9 @@ after_gc_sweep(rb_objspace_t *objspace)
free_unused_heaps(objspace);
+ gc_prof_set_malloc_info(objspace);
+ gc_prof_set_heap_info(objspace);
+
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_END, 0 /* TODO: pass minor/immediate flag? */);
}
@@ -3614,6 +3613,14 @@ gc_marks(rb_objspace_t *objspace, int minor_gc)
gc_marks_body(objspace, TRUE);
}
}
+
+#if RGENGC_PROFILE > 0
+ if (gc_prof_record(objspace)) {
+ gc_profile_record *record = gc_prof_record(objspace);
+ record->oldgen_objects = objspace->rgengc.oldgen_object_count;
+ }
+#endif
+
#else /* USE_RGENGC */
gc_marks_body(objspace, FALSE);
#endif
@@ -3736,10 +3743,15 @@ rgengc_rememberset_mark(rb_objspace_t *objspace)
}
rgengc_report(2, objspace, "rgengc_rememberset_mark: clear_count: %"PRIdSIZE", shady_object_count: %"PRIdSIZE"\n", clear_count, shady_object_count);
+
#if RGENGC_PROFILE > 0
- objspace->profile.remembered_normal_objects = clear_count;
- objspace->profile.remembered_shady_objects = shady_object_count;
+ if (gc_prof_record(objspace)) {
+ gc_profile_record *record = gc_prof_record(objspace);
+ record->remembered_normal_objects = clear_count;
+ record->remembered_shady_objects = shady_object_count;
+ }
#endif
+
return shady_object_count;
}
@@ -3935,9 +3947,10 @@ garbage_collect_body(rb_objspace_t *objspace, int full_mark, int immediate_sweep
if (GC_NOTIFY) fprintf(stderr, "start garbage_collect(%d, %d, %d)\n", full_mark, immediate_sweep, reason);
objspace->count++;
+ gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_START, 0 /* TODO: pass minor/immediate flag? */);
+
objspace->profile.total_allocated_object_num_at_gc_start = objspace->total_allocated_object_num;
objspace->profile.heaps_used_at_gc_start = heaps_used;
- gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_START, 0 /* TODO: pass minor/immediate flag? */);
gc_prof_timer_start(objspace, reason);
{
@@ -4889,7 +4902,6 @@ wmap_aref(VALUE self, VALUE wmap)
------------------------------ GC profiler ------------------------------
*/
-static inline void gc_prof_set_heap_info(rb_objspace_t *, gc_profile_record *);
#define GC_PROFILE_RECORD_DEFAULT_SIZE 100
static double
@@ -4987,7 +4999,6 @@ gc_prof_timer_stop(rb_objspace_t *objspace)
gc_profile_record *record = gc_prof_record(objspace);
record->gc_time = elapsed_time_from(record->gc_invoke_time);
record->gc_invoke_time -= objspace->profile.invoke_time;
- gc_prof_set_heap_info(objspace, record);
}
}
@@ -5076,30 +5087,25 @@ gc_prof_set_malloc_info(rb_objspace_t *objspace)
}
static inline void
-gc_prof_set_heap_info(rb_objspace_t *objspace, gc_profile_record *record)
+gc_prof_set_heap_info(rb_objspace_t *objspace)
{
- size_t live = objspace->profile.total_allocated_object_num_at_gc_start - objspace->total_freed_object_num;
- size_t total = objspace->profile.heaps_used_at_gc_start * HEAP_OBJ_LIMIT;
+ if (objspace->profile.run) {
+ gc_profile_record *record = gc_prof_record(objspace);
+ size_t live = objspace->profile.total_allocated_object_num_at_gc_start - objspace->total_freed_object_num;
+ size_t total = objspace->profile.heaps_used_at_gc_start * HEAP_OBJ_LIMIT;
#if GC_PROFILE_MORE_DETAIL
- record->heap_use_slots = objspace->profile.heaps_used_at_gc_start;
- record->heap_live_objects = live;
- record->heap_free_objects = total - live;
+ record->heap_use_slots = objspace->profile.heaps_used_at_gc_start;
+ record->heap_live_objects = live;
+ record->heap_free_objects = total - live;
#endif
-#if RGENGC_PROFILE > 0
- record->oldgen_objects = objspace->rgengc.oldgen_object_count;
- record->remembered_normal_objects = objspace->profile.remembered_normal_objects;
- record->remembered_shady_objects = objspace->profile.remembered_shady_objects;
-#endif
-
- record->heap_total_objects = total;
- record->heap_use_size = live * sizeof(RVALUE);
- record->heap_total_size = total * sizeof(RVALUE);
+ record->heap_total_objects = total;
+ record->heap_use_size = live * sizeof(RVALUE);
+ record->heap_total_size = total * sizeof(RVALUE);
+ }
}
-
-
/*
* call-seq:
* GC::Profiler.clear -> nil