@@ -685,6 +685,8 @@ typedef struct rb_objspace {
685685
686686 unsigned long live_ractor_cache_count ;
687687
688+ unsigned int sweeping_heaps ; /* bitfield: bit i set while heap i is sweeping */
689+
688690 int fork_vm_lock_lev ;
689691} rb_objspace_t ;
690692
@@ -1020,12 +1022,7 @@ gc_mode_verify(enum gc_mode mode)
10201022static inline bool
10211023has_sweeping_pages (rb_objspace_t * objspace )
10221024{
1023- for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
1024- if ((& heaps [i ])-> sweeping_page ) {
1025- return TRUE;
1026- }
1027- }
1028- return FALSE;
1025+ return objspace -> sweeping_heaps != 0 ;
10291026}
10301027
10311028static inline size_t
@@ -3024,6 +3021,7 @@ gc_abort(void *objspace_ptr)
30243021 }
30253022
30263023 if (is_lazy_sweeping (objspace )) {
3024+ objspace -> sweeping_heaps = 0 ;
30273025 for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
30283026 rb_heap_t * heap = & heaps [i ];
30293027
@@ -3758,6 +3756,9 @@ static void
37583756gc_sweep_start_heap (rb_objspace_t * objspace , rb_heap_t * heap )
37593757{
37603758 heap -> sweeping_page = ccan_list_top (& heap -> pages , struct heap_page , page_node );
3759+ if (heap -> sweeping_page ) {
3760+ objspace -> sweeping_heaps |= (1u << (heap - heaps ));
3761+ }
37613762 heap -> free_pages = NULL ;
37623763 heap -> pooled_pages = NULL ;
37633764 if (!objspace -> flags .immediate_sweep ) {
@@ -3984,6 +3985,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
39843985 } while ((sweep_page = heap -> sweeping_page ));
39853986
39863987 if (!heap -> sweeping_page ) {
3988+ objspace -> sweeping_heaps &= ~(1u << (heap - heaps ));
39873989 gc_sweep_finish_heap (objspace , heap );
39883990
39893991 if (!has_sweeping_pages (objspace )) {
0 commit comments