@@ -2056,7 +2056,7 @@ heap_allocatable_bytes_expand(rb_objspace_t *objspace,
20562056 }
20572057
20582058 if (gc_params .growth_max_bytes > 0 ) {
2059- size_t max_total_slots = total_slots + gc_params .growth_max_bytes / slot_size ;
2059+ size_t max_total_slots = total_slots + ( gc_params .growth_max_bytes / slot_size ) ;
20602060 if (target_total_slots > max_total_slots ) target_total_slots = max_total_slots ;
20612061 }
20622062
@@ -2106,6 +2106,7 @@ heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pag
21062106 GC_ASSERT (heap -> total_pages > 0 );
21072107 heap -> total_pages -- ;
21082108 GC_ASSERT (heap -> total_slots >= page -> total_slots );
2109+ GC_ASSERT (page -> total_slots > 0 );
21092110 heap -> total_slots -= page -> total_slots ;
21102111}
21112112
@@ -3053,8 +3054,7 @@ rb_gc_impl_make_zombie(void *objspace_ptr, VALUE obj, void (*dfree)(void *), voi
30533054 zombie -> dfree = dfree ;
30543055 zombie -> data = data ;
30553056 VALUE prev , next = (VALUE )RUBY_ATOMIC_PTR_LOAD (heap_pages_deferred_final );
3056- struct heap_page * page_after = GET_HEAP_PAGE (zombie );
3057- GC_ASSERT (page == page_after );
3057+ GC_ASSERT (page == GET_HEAP_PAGE (zombie ));
30583058 do {
30593059 zombie -> next = prev = next ;
30603060 next = RUBY_ATOMIC_VALUE_CAS (heap_pages_deferred_final , prev , obj );
@@ -7019,7 +7019,13 @@ gc_marks_finish(rb_objspace_t *objspace)
70197019 }
70207020
70217021 if (full_marking ) {
7022- heap_allocatable_bytes_expand (objspace , NULL , sweep_slots , total_slots , heaps [0 ].slot_size );
7022+ /* Use weighted average slot size since total_slots spans all heaps */
7023+ size_t total_heap_bytes = 0 ;
7024+ for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
7025+ total_heap_bytes += heaps [i ].total_slots * heaps [i ].slot_size ;
7026+ }
7027+ size_t avg_slot_size = total_slots > 0 ? total_heap_bytes / total_slots : heaps [0 ].slot_size ;
7028+ heap_allocatable_bytes_expand (objspace , NULL , sweep_slots , total_slots , avg_slot_size );
70237029 }
70247030 }
70257031
0 commit comments