@@ -5628,7 +5628,17 @@ gc_sweep_finish(rb_objspace_t *objspace)
56285628static struct heap_page *
56295629gc_sweep_dequeue_page (rb_objspace_t * objspace , rb_heap_t * heap , bool free_in_user_thread , bool * dequeued_unswept_page )
56305630{
5631- /* 1) Local drain cache from a previous bulk grab. */
5631+ /* 1) Resume an outstanding claimed range. */
5632+ if (heap -> claimed_local_start < heap -> claimed_local_end ) {
5633+ GC_ASSERT (heap -> claimed_local_end <= rb_darray_size (heap -> sweep_pages ));
5634+ GC_ASSERT (heap -> claimed_local_start < rb_darray_size (heap -> sweep_pages ));
5635+ struct heap_page * page = heap -> sweep_pages -> data [heap -> claimed_local_start ++ ];
5636+ * dequeued_unswept_page = true;
5637+ psweep_debug (0 , "[gc] gc_sweep_dequeue_page: got claimed page:%p (heap %ld)\n" , page , heap - heaps );
5638+ return page ;
5639+ }
5640+
5641+ /* 2) Local drain cache from a previous bulk grab. */
56325642retry :
56335643 if (heap -> drained_local ) {
56345644 struct heap_page * page = heap -> drained_local ;
@@ -5640,19 +5650,10 @@ gc_sweep_dequeue_page(rb_objspace_t *objspace, rb_heap_t *heap, bool free_in_use
56405650 }
56415651retry_drain :
56425652
5643- /* 2 ) Bulk-drain the worker's pre-swept stack with one xchg. */
5653+ /* 3 ) Bulk-drain the worker's pre-swept stack with one xchg. */
56445654 heap -> drained_local = sweep_stack_drain (heap );
56455655 if (heap -> drained_local ) goto retry ;
56465656
5647- /* 3) Resume an outstanding claimed range. */
5648- if (heap -> claimed_local_start < heap -> claimed_local_end ) {
5649- GC_ASSERT (heap -> claimed_local_end <= rb_darray_size (heap -> sweep_pages ));
5650- GC_ASSERT (heap -> claimed_local_start < rb_darray_size (heap -> sweep_pages ));
5651- struct heap_page * page = heap -> sweep_pages -> data [heap -> claimed_local_start ++ ];
5652- * dequeued_unswept_page = true;
5653- psweep_debug (0 , "[gc] gc_sweep_dequeue_page: got claimed page:%p (heap %ld)\n" , page , heap - heaps );
5654- return page ;
5655- }
56565657
56575658 /* 4) Claim a fresh chunk. */
56585659 if (sweep_claim_chunk (heap , & heap -> claimed_local_start , & heap -> claimed_local_end , SWEEP_CHUNK , false)) {
0 commit comments