summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter.zhu@shopify.com>2021-09-17 14:38:06 -0400
committerPeter Zhu <peter@peterzhu.ca>2021-09-20 09:01:58 -0400
commit9770bf23b7a273246b9a6b084e79a8fb6fc1af11 (patch)
tree84b93cb20eeeeeaf85a62da25e42715762dbe7aa /gc.c
parentb61064b821823e016e8015f3d9eeab3cf9074ccd (diff)
Fix malloc_increase is not correctly calculated
Commit 123eeb1c1a904923754ce65148dbef045b56e083 added incremental GC which moved resetting malloc_increase, oldmalloc_increase to before marking. However, during_minor_gc is not set until gc_marks_start. So the value will be from the last GC run, rather than the current one. Before the incremental GC commit, this code was in gc_before_sweep which ran before sweep (after marking) so the value during_minor_gc was correct.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4860
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/gc.c b/gc.c
index 57a757dadd..40c035fcd2 100644
--- a/gc.c
+++ b/gc.c
@@ -8881,7 +8881,7 @@ ready_to_gc(rb_objspace_t *objspace)
}
static void
-gc_reset_malloc_info(rb_objspace_t *objspace)
+gc_reset_malloc_info(rb_objspace_t *objspace, bool full_mark)
{
gc_prof_set_malloc_info(objspace);
{
@@ -8915,7 +8915,7 @@ gc_reset_malloc_info(rb_objspace_t *objspace)
/* reset oldmalloc info */
#if RGENGC_ESTIMATE_OLDMALLOC
- if (!is_full_marking(objspace)) {
+ if (!full_mark) {
if (objspace->rgengc.oldmalloc_increase > objspace->rgengc.oldmalloc_increase_limit) {
objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_OLDMALLOC;
objspace->rgengc.oldmalloc_increase_limit =
@@ -9071,7 +9071,7 @@ gc_start(rb_objspace_t *objspace, unsigned int reason)
objspace->profile.total_allocated_objects_at_gc_start = objspace->total_allocated_objects;
objspace->profile.heap_used_at_gc_start = heap_allocated_pages;
gc_prof_setup_new_record(objspace, reason);
- gc_reset_malloc_info(objspace);
+ gc_reset_malloc_info(objspace, do_full_mark);
rb_transient_heap_start_marking(do_full_mark);
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_START, 0 /* TODO: pass minor/immediate flag? */);