@@ -388,24 +388,16 @@ static void sweep_weak_refs(void)
388388 jl_ptls_t ptls2 = gc_all_tls_states [i ];
389389 if (ptls2 != NULL ) {
390390 size_t n = 0 ;
391- size_t ndel = 0 ;
391+ size_t i = 0 ;
392392 size_t l = ptls2 -> gc_tls_common .heap .weak_refs .len ;
393393 void * * lst = ptls2 -> gc_tls_common .heap .weak_refs .items ;
394- if (l == 0 )
395- continue ;
396- while (1 ) {
397- jl_weakref_t * wr = (jl_weakref_t * )lst [n ];
394+ // filter with preserving order
395+ for (i = 0 ; i < l ; i ++ ) {
396+ jl_weakref_t * wr = (jl_weakref_t * )lst [i ];
398397 if (gc_marked (jl_astaggedvalue (wr )-> bits .gc ))
399- n ++ ;
400- else
401- ndel ++ ;
402- if (n >= l - ndel )
403- break ;
404- void * tmp = lst [n ];
405- lst [n ] = lst [n + ndel ];
406- lst [n + ndel ] = tmp ;
398+ lst [n ++ ] = wr ;
407399 }
408- ptls2 -> gc_tls_common .heap .weak_refs .len -= ndel ;
400+ ptls2 -> gc_tls_common .heap .weak_refs .len = n ;
409401 }
410402 }
411403}
@@ -629,10 +621,9 @@ void jl_gc_reset_alloc_count(void) JL_NOTSAFEPOINT
629621 reset_thread_gc_counts ();
630622}
631623
632- static void jl_gc_free_memory (jl_value_t * v , int isaligned ) JL_NOTSAFEPOINT
624+ static void jl_gc_free_memory (jl_genericmemory_t * m , int isaligned ) JL_NOTSAFEPOINT
633625{
634- assert (jl_is_genericmemory (v ));
635- jl_genericmemory_t * m = (jl_genericmemory_t * )v ;
626+ assert (jl_is_genericmemory (m ));
636627 assert (jl_genericmemory_how (m ) == 1 || jl_genericmemory_how (m ) == 2 );
637628 char * d = (char * )m -> ptr ;
638629 size_t freed_bytes = memory_block_usable_size (d , isaligned );
@@ -654,25 +645,25 @@ static void sweep_malloced_memory(void) JL_NOTSAFEPOINT
654645 for (int t_i = 0 ; t_i < gc_n_threads ; t_i ++ ) {
655646 jl_ptls_t ptls2 = gc_all_tls_states [t_i ];
656647 if (ptls2 != NULL ) {
657- mallocmemory_t * ma = ptls2 -> gc_tls_common . heap . mallocarrays ;
658- mallocmemory_t * * pma = & ptls2 -> gc_tls_common .heap .mallocarrays ;
659- while ( ma != NULL ) {
660- mallocmemory_t * nxt = ma -> next ;
661- jl_value_t * a = ( jl_value_t * )(( uintptr_t ) ma -> a & ~ 1 );
662- int bits = jl_astaggedvalue ( a ) -> bits . gc ;
663- if (gc_marked (bits )) {
664- pma = & ma -> next ;
648+ size_t n = 0 ;
649+ size_t l = ptls2 -> gc_tls_common .heap .mallocarrays . len ;
650+ void * * lst = ptls2 -> gc_tls_common . heap . mallocarrays . items ;
651+ // filter without preserving order
652+ while ( n < l ) {
653+ jl_genericmemory_t * m = ( jl_genericmemory_t * )(( uintptr_t ) lst [ n ] & ~ 1 ) ;
654+ if (gc_marked (jl_astaggedvalue ( m ) -> bits . gc )) {
655+ n ++ ;
665656 }
666657 else {
667- * pma = nxt ;
668- int isaligned = (uintptr_t )ma -> a & 1 ;
669- jl_gc_free_memory (a , isaligned );
670- ma -> next = ptls2 -> gc_tls_common .heap .mafreelist ;
671- ptls2 -> gc_tls_common .heap .mafreelist = ma ;
658+ int isaligned = (uintptr_t )lst [n ] & 1 ;
659+ jl_gc_free_memory (m , isaligned );
660+ l -- ;
661+ if (l == 0 )
662+ break ;
663+ lst [n ] = lst [l ];
672664 }
673- gc_time_count_mallocd_memory (bits );
674- ma = nxt ;
675665 }
666+ ptls2 -> gc_tls_common .heap .mallocarrays .len = l ;
676667 }
677668 }
678669 gc_time_mallocd_memory_end ();
@@ -3439,8 +3430,7 @@ void jl_init_thread_heap(jl_ptls_t ptls)
34393430 small_arraylist_new (& common_heap -> live_tasks , 0 );
34403431 for (int i = 0 ; i < JL_N_STACK_POOLS ; i ++ )
34413432 small_arraylist_new (& common_heap -> free_stacks [i ], 0 );
3442- common_heap -> mallocarrays = NULL ;
3443- common_heap -> mafreelist = NULL ;
3433+ small_arraylist_new (& common_heap -> mallocarrays , 0 );
34443434 heap -> young_generation_of_bigvals = (bigval_t * )calloc_s (sizeof (bigval_t )); // sentinel
34453435 assert (gc_bigval_sentinel_tag != 0 ); // make sure the sentinel is initialized
34463436 heap -> young_generation_of_bigvals -> header = gc_bigval_sentinel_tag ;
0 commit comments