Skip to content

Commit 94d31d6

Browse files
committed
Change direction in gc_sweep_continue if sweep thread didn't make fg skip first heap
1 parent d91cc7f commit 94d31d6

1 file changed

Lines changed: 37 additions & 3 deletions

File tree

gc/default/default.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

54595459
unsigned 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+
54615494
static void
54625495
gc_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

Comments
 (0)