Skip to content

Commit 27fcc09

Browse files
committed
sort pages
1 parent 6afe64e commit 27fcc09

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

src/gc.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,11 @@ void gc_free_pages(void)
16741674
}
16751675
}
16761676

1677+
static int gc_pg_cmp(jl_gc_pagemeta_t *pg, jl_gc_pagemeta_t *pg2)
1678+
{
1679+
return (pg->nfree - pg2->nfree);
1680+
}
1681+
16771682
// setup the data-structures for a sweep over all memory pools
16781683
static void gc_sweep_pool(void)
16791684
{
@@ -1746,25 +1751,39 @@ static void gc_sweep_pool(void)
17461751
}
17471752
}
17481753

1754+
// create a temporary array of pages to sort them
1755+
ws_queue_t queue;
1756+
memset(&queue, 0, sizeof(ws_queue_t));
1757+
queue.array = create_ws_array((1 << 10), sizeof(jl_gc_pagemeta_t*));
17491758
// merge free lists
17501759
for (int t_i = 0; t_i < n_threads; t_i++) {
17511760
jl_ptls_t ptls2 = gc_all_tls_states[t_i];
17521761
if (ptls2 == NULL) {
17531762
continue;
17541763
}
1764+
jl_atomic_store_relaxed(&queue.bottom, 0);
17551765
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
17561766
while (pg != NULL) {
1767+
ws_queue_push(&queue, &pg, sizeof(jl_gc_pagemeta_t*));
17571768
jl_gc_pagemeta_t *pg2 = pg->next;
1769+
pg = pg2;
1770+
}
1771+
// sort by number of free objects in ascending order
1772+
int64_t b = jl_atomic_load_relaxed(&queue.bottom);
1773+
qsort(queue.array->buffer, b, sizeof(jl_gc_pagemeta_t*), (int (*)(const void *, const void *))gc_pg_cmp);
1774+
for (int i = 0; i < b; i++) {
1775+
jl_gc_pagemeta_t *pg = ((jl_gc_pagemeta_t**)queue.array->buffer)[i];
17581776
if (pg->fl_begin_offset != UINT16_MAX) {
17591777
char *cur_pg = pg->data;
17601778
jl_taggedvalue_t *fl_beg = (jl_taggedvalue_t*)(cur_pg + pg->fl_begin_offset);
17611779
jl_taggedvalue_t *fl_end = (jl_taggedvalue_t*)(cur_pg + pg->fl_end_offset);
17621780
*pfl[t_i * JL_GC_N_POOLS + pg->pool_n] = fl_beg;
17631781
pfl[t_i * JL_GC_N_POOLS + pg->pool_n] = &fl_end->next;
17641782
}
1765-
pg = pg2;
17661783
}
17671784
}
1785+
free(queue.array->buffer);
1786+
free(queue.array);
17681787

17691788
// null out terminal pointers of free lists
17701789
for (int t_i = 0; t_i < n_threads; t_i++) {

0 commit comments

Comments
 (0)