@@ -683,13 +683,18 @@ typedef struct rb_objspace {
683683 struct timespec ruby_thread_sweep_cpu_start_time ;
684684 struct timespec ruby_thread_sweep_wall_start_time ;
685685#endif
686- size_t pages_swept_by_sweep_thread ;
687- size_t pages_swept_by_sweep_thread_had_deferred_free_objects ;
688686
689687 /* Weak references */
690688 size_t weak_references_count ;
691689 } profile ;
692690
691+ /* Cumulative sweep counters that persist across GC cycles (never reset) */
692+ struct {
693+ size_t pages_swept_by_sweep_thread ;
694+ size_t pages_swept_by_sweep_thread_had_deferred_free_objects ;
695+ size_t pages_swept_by_ruby_thread ;
696+ } sweep_stats ;
697+
693698 VALUE gc_stress_mode ;
694699
695700 struct {
@@ -4210,6 +4215,7 @@ gc_sweep_page(rb_objspace_t *objspace, rb_heap_t *heap, struct gc_sweep_context
42104215#endif
42114216 rbimpl_atomic_store (& sweep_page -> before_sweep , 0 , RBIMPL_ATOMIC_RELEASE );
42124217 sweep_page -> free_slots = 0 ;
4218+ objspace -> sweep_stats .pages_swept_by_ruby_thread ++ ;
42134219
42144220 p = (uintptr_t )sweep_page -> start ;
42154221 bits = sweep_page -> mark_bits ;
@@ -4572,9 +4578,9 @@ gc_pre_sweep_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pa
45724578 }
45734579 p += BITS_BITLENGTH * slot_size ;
45744580 }
4575- objspace -> profile .pages_swept_by_sweep_thread ++ ;
4581+ objspace -> sweep_stats .pages_swept_by_sweep_thread ++ ;
45764582 if (page -> pre_deferred_free_slots > 0 ) {
4577- objspace -> profile .pages_swept_by_sweep_thread_had_deferred_free_objects ++ ;
4583+ objspace -> sweep_stats .pages_swept_by_sweep_thread_had_deferred_free_objects ++ ;
45784584 }
45794585
45804586#if RGENGC_CHECK_MODE
@@ -9214,8 +9220,10 @@ enum gc_stat_sym {
92149220 gc_stat_sym_remembered_wb_unprotected_objects_limit ,
92159221 gc_stat_sym_old_objects ,
92169222 gc_stat_sym_old_objects_limit ,
9223+ gc_stat_sym_pages_swept ,
92179224 gc_stat_sym_pages_swept_by_sweep_thread ,
92189225 gc_stat_sym_pages_swept_by_sweep_thread_had_deferred_free_objects ,
9226+ gc_stat_sym_pages_swept_by_ruby_thread ,
92199227#if RGENGC_ESTIMATE_OLDMALLOC
92209228 gc_stat_sym_oldmalloc_increase_bytes ,
92219229 gc_stat_sym_oldmalloc_increase_bytes_limit ,
@@ -9271,8 +9279,10 @@ setup_gc_stat_symbols(void)
92719279 S (remembered_wb_unprotected_objects_limit );
92729280 S (old_objects );
92739281 S (old_objects_limit );
9282+ S (pages_swept );
92749283 S (pages_swept_by_sweep_thread );
92759284 S (pages_swept_by_sweep_thread_had_deferred_free_objects );
9285+ S (pages_swept_by_ruby_thread );
92769286#if RGENGC_ESTIMATE_OLDMALLOC
92779287 S (oldmalloc_increase_bytes );
92789288 S (oldmalloc_increase_bytes_limit );
@@ -9359,8 +9369,10 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym)
93599369 SET (remembered_wb_unprotected_objects_limit , objspace -> rgengc .uncollectible_wb_unprotected_objects_limit );
93609370 SET (old_objects , objspace -> rgengc .old_objects );
93619371 SET (old_objects_limit , objspace -> rgengc .old_objects_limit );
9362- SET (pages_swept_by_sweep_thread , objspace -> profile .pages_swept_by_sweep_thread );
9363- SET (pages_swept_by_sweep_thread_had_deferred_free_objects , objspace -> profile .pages_swept_by_sweep_thread_had_deferred_free_objects );
9372+ SET (pages_swept , objspace -> sweep_stats .pages_swept_by_sweep_thread + objspace -> sweep_stats .pages_swept_by_ruby_thread );
9373+ SET (pages_swept_by_sweep_thread , objspace -> sweep_stats .pages_swept_by_sweep_thread );
9374+ SET (pages_swept_by_sweep_thread_had_deferred_free_objects , objspace -> sweep_stats .pages_swept_by_sweep_thread_had_deferred_free_objects );
9375+ SET (pages_swept_by_ruby_thread , objspace -> sweep_stats .pages_swept_by_ruby_thread );
93649376#if RGENGC_ESTIMATE_OLDMALLOC
93659377 SET (oldmalloc_increase_bytes , objspace -> malloc_counters .oldmalloc_increase );
93669378 SET (oldmalloc_increase_bytes_limit , objspace -> rgengc .oldmalloc_increase_limit );
0 commit comments