@@ -4911,7 +4911,7 @@ gc_sweep_start(rb_objspace_t *objspace)
49114911
49124912 objspace -> heaps_done_background_sweep = 0 ;
49134913
4914- for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
4914+ for (int i = HEAP_COUNT - 1 ; i >= 0 ; i -- ) {
49154915 rb_heap_t * heap = & heaps [i ];
49164916 gc_sweep_start_heap (objspace , heap );
49174917
@@ -5458,6 +5458,39 @@ gc_sweep_rest(rb_objspace_t *objspace)
54585458
54595459unsigned long long sweep_continue_count = 0 ;
54605460
5461+ static int
5462+ sweep_heap_first (bool sweep_backwards )
5463+ {
5464+ if (sweep_backwards ) {
5465+ return HEAP_COUNT - 1 ;
5466+ }
5467+ else {
5468+ return 0 ;
5469+ }
5470+ }
5471+
5472+ static int
5473+ sweep_heap_last (bool sweep_backwards )
5474+ {
5475+ if (sweep_backwards ) {
5476+ return -1 ;
5477+ }
5478+ else {
5479+ return HEAP_COUNT ;
5480+ }
5481+ }
5482+
5483+ static void
5484+ sweep_heap_iter (bool sweep_backwards , int * i )
5485+ {
5486+ if (sweep_backwards ) {
5487+ (* i )-- ;
5488+ }
5489+ else {
5490+ (* i )++ ;
5491+ }
5492+ }
5493+
54615494static void
54625495gc_sweep_continue (rb_objspace_t * objspace , rb_heap_t * sweep_heap )
54635496{
@@ -5468,6 +5501,7 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *sweep_heap)
54685501
54695502 sweep_continue_count ++ ;
54705503
5504+ int num_heaps_need_continue = 0 ;
54715505 gc_sweeping_enter (objspace , "gc_sweep_continue" );
54725506 sweep_lock_lock (& objspace -> sweep_lock );
54735507 {
@@ -5476,7 +5510,6 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *sweep_heap)
54765510 psweep_debug (-2 , "[gc] gc_sweep_continue: bg done, not requesting\n" );
54775511 }
54785512 else {
5479- int num_heaps_need_continue = 0 ;
54805513 for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
54815514 rb_heap_t * heap = & heaps [i ];
54825515 heap -> background_sweep_steps = heap -> foreground_sweep_steps ;
@@ -5509,12 +5542,13 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *sweep_heap)
55095542 }
55105543 }
55115544 sweep_lock_unlock (& objspace -> sweep_lock );
5545+ bool sweep_backwards = num_heaps_need_continue > 0 && !heaps [0 ].skip_sweep_continue ;
55125546
55135547#if PSWEEP_LOCK_STATS > 0
55145548 current_step_type = 1 ;
55155549 step_contention [1 ].step_count ++ ;
55165550#endif
5517- for (int i = 0 ; i < HEAP_COUNT ; i ++ ) {
5551+ for (int i = sweep_heap_first ( sweep_backwards ) ; i != sweep_heap_last ( sweep_backwards ); sweep_heap_iter ( sweep_backwards , & i ) ) {
55185552 rb_heap_t * heap = & heaps [i ];
55195553
55205554 if (gc_sweep_step (objspace , heap )) {
0 commit comments