@@ -1232,10 +1232,7 @@ static NOINLINE jl_taggedvalue_t *gc_add_page(jl_gc_pool_t *p) JL_NOTSAFEPOINT
12321232 // Do not pass in `ptls` as argument. This slows down the fast path
12331233 // in pool_alloc significantly
12341234 jl_ptls_t ptls = jl_current_task -> ptls ;
1235- jl_gc_pagemeta_t * pg = pop_page_metadata_back (& ptls -> page_metadata_lazily_freed );
1236- if (pg == NULL ) {
1237- pg = jl_gc_alloc_page ();
1238- }
1235+ jl_gc_pagemeta_t * pg = jl_gc_alloc_page ();
12391236 pg -> osize = p -> osize ;
12401237 pg -> thread_n = ptls -> tid ;
12411238 set_page_metadata (pg );
@@ -1292,8 +1289,20 @@ STATIC_INLINE jl_value_t *jl_gc_pool_alloc_inner(jl_ptls_t ptls, int pool_offset
12921289 assert (pg -> osize == p -> osize );
12931290 pg -> nfree = 0 ;
12941291 pg -> has_young = 1 ;
1292+ pg = pop_page_metadata_back (& ptls -> page_metadata_lazily_freed );
1293+ if (pg != NULL ) {
1294+ v = gc_reset_page (ptls , p , pg );
1295+ pg -> osize = p -> osize ;
1296+ push_page_metadata_back (& ptls -> page_metadata_allocd , pg );
1297+ }
1298+ else {
1299+ v = NULL ;
1300+ }
1301+ }
1302+ // Not an else!!
1303+ if (v == NULL ) {
1304+ v = gc_add_page (p );
12951305 }
1296- v = gc_add_page (p );
12971306 next = (jl_taggedvalue_t * )((char * )v + osize );
12981307 }
12991308 p -> newpages = next ;
@@ -1352,12 +1361,10 @@ static jl_taggedvalue_t **gc_sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t **allo
13521361 // the eager one uses less memory.
13531362 // FIXME - need to do accounting on a per-thread basis
13541363 // on quick sweeps, keep a few pages empty but allocated for performance
1355- #ifdef _P64 // TODO: re-enable this on `_P32`?
13561364 if (!sweep_full && lazy_freed_pages <= default_collect_interval / GC_PAGE_SZ ) {
13571365 lazy_freed_pages ++ ;
13581366 freed_lazily = 1 ;
13591367 }
1360- #endif
13611368 nfree = (GC_PAGE_SZ - GC_PAGE_OFFSET ) / osize ;
13621369 goto done ;
13631370 }
0 commit comments