From af321ea7273e43d65ea7f5743f56e10dcd4e98b0 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 3 Feb 2022 11:51:20 -0500 Subject: [PATCH] Move total_freed_pages to size pool --- gc.c | 20 +++++++++++++++++--- test/ruby/test_gc.rb | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index e7cd8c373a..e637861ab2 100644 --- a/gc.c +++ b/gc.c @@ -691,6 +691,7 @@ typedef struct rb_size_pool_struct { /* Basic statistics */ size_t total_allocated_pages; + size_t total_freed_pages; #if USE_RVARGC /* Sweeping statistics */ @@ -809,7 +810,6 @@ typedef struct rb_objspace { /* basic statistics */ size_t count; size_t total_freed_objects; - size_t total_freed_pages; uint64_t total_time_ns; struct timespec start_time; } profile; @@ -1085,6 +1085,17 @@ total_allocated_pages(rb_objspace_t *objspace) return count; } +static inline size_t +total_freed_pages(rb_objspace_t *objspace) +{ + size_t count = 0; + for (int i = 0; i < SIZE_POOL_COUNT; i++) { + rb_size_pool_t *size_pool = &size_pools[i]; + count += size_pool->total_freed_pages; + } + return count; +} + #define gc_mode(objspace) gc_mode_verify((enum gc_mode)(objspace)->flags.mode) #define gc_mode_set(objspace, mode) ((objspace)->flags.mode = (unsigned int)gc_mode_verify(mode)) @@ -1937,7 +1948,7 @@ static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page) { heap_allocated_pages--; - objspace->profile.total_freed_pages++; + page->size_pool->total_freed_pages++; rb_aligned_free(GET_PAGE_BODY(page->start), HEAP_PAGE_SIZE); free(page); } @@ -10670,7 +10681,7 @@ gc_stat_internal(VALUE hash_or_sym) SET(heap_eden_pages, heap_eden_total_pages(objspace)); SET(heap_tomb_pages, heap_tomb_total_pages(objspace)); SET(total_allocated_pages, total_allocated_pages(objspace)); - SET(total_freed_pages, objspace->profile.total_freed_pages); + SET(total_freed_pages, total_freed_pages(objspace)); SET(total_allocated_objects, objspace->total_allocated_objects); SET(total_freed_objects, objspace->profile.total_freed_objects); SET(malloc_increase_bytes, malloc_increase); @@ -10760,6 +10771,7 @@ enum gc_stat_heap_sym { gc_stat_heap_sym_heap_tomb_pages, gc_stat_heap_sym_heap_tomb_slots, gc_stat_heap_sym_total_allocated_pages, + gc_stat_heap_sym_total_freed_pages, gc_stat_heap_sym_last }; @@ -10777,6 +10789,7 @@ setup_gc_stat_heap_symbols(void) S(heap_tomb_pages); S(heap_tomb_slots); S(total_allocated_pages); + S(total_freed_pages); #undef S } } @@ -10818,6 +10831,7 @@ gc_stat_heap_internal(int size_pool_idx, VALUE hash_or_sym) SET(heap_tomb_pages, SIZE_POOL_TOMB_HEAP(size_pool)->total_pages); SET(heap_tomb_slots, SIZE_POOL_TOMB_HEAP(size_pool)->total_slots); SET(total_allocated_pages, size_pool->total_allocated_pages); + SET(total_freed_pages, size_pool->total_freed_pages); #undef SET if (!NIL_P(key)) { /* matched key should return above */ diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index e19df8f2f9..b081e9fa78 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -159,6 +159,7 @@ class TestGc < Test::Unit::TestCase assert_operator stat_heap[:heap_tomb_pages], :<=, stat[:heap_tomb_pages] assert_operator stat_heap[:heap_tomb_slots], :>=, 0 assert_operator stat_heap[:total_allocated_pages], :>=, 0 + assert_operator stat_heap[:total_freed_pages], :>=, 0 end GC.stat_heap(0, stat_heap) @@ -205,6 +206,7 @@ class TestGc < Test::Unit::TestCase assert_equal stat[:heap_tomb_pages], stat_heap_sum[:heap_tomb_pages] assert_equal stat[:heap_available_slots], stat_heap_sum[:heap_eden_slots] + stat_heap_sum[:heap_tomb_slots] assert_equal stat[:total_allocated_pages], stat_heap_sum[:total_allocated_pages] + assert_equal stat[:total_freed_pages], stat_heap_sum[:total_freed_pages] end def test_latest_gc_info