@@ -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
16781683static 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