@@ -407,10 +407,13 @@ static inline int gc_setmark_pool(void *o, int mark_mode)
407
407
mark_mode = GC_MARKED ;
408
408
}
409
409
if (!(bits & GC_MARKED )) {
410
- if (mark_mode == GC_MARKED )
410
+ if (mark_mode == GC_MARKED ) {
411
411
perm_scanned_bytes += page -> osize ;
412
- else
412
+ page -> nold ++ ;
413
+ }
414
+ else {
413
415
scanned_bytes += page -> osize ;
416
+ }
414
417
objprofile_count (jl_typeof (jl_valueof (o )),
415
418
mark_mode == GC_MARKED , page -> osize );
416
419
}
@@ -878,8 +881,8 @@ static gcval_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl
878
881
// For quick sweep, we might be able to skip the page if the page doesn't
879
882
// have any young live cell before marking.
880
883
if (sweep_mask == GC_MARKED_NOESC && !pg -> has_young ) {
881
- // TODO handle ` prev_sweep_mask == GC_MARKED` with additional counters
882
- if (prev_sweep_mask == GC_MARKED_NOESC ) {
884
+ assert ( prev_sweep_mask == GC_MARKED_NOESC || pg -> prev_nold >= pg -> nold );
885
+ if (prev_sweep_mask == GC_MARKED_NOESC || pg -> prev_nold == pg -> nold ) {
883
886
// the position of the freelist begin/end in this page
884
887
// is stored in its metadata
885
888
if (pg -> fl_begin_offset != (uint16_t )-1 ) {
@@ -895,6 +898,7 @@ static gcval_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl
895
898
{ // scope to avoid clang goto errors
896
899
int has_marked = 0 ;
897
900
int has_young = 0 ;
901
+ int16_t prev_nold = 0 ;
898
902
int pg_nfree = 0 ;
899
903
gcval_t * * pfl_begin = NULL ;
900
904
uint8_t msk = 1 ; // mask for the age bit in the current age byte
@@ -914,6 +918,7 @@ static gcval_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl
914
918
if (sweep_mask == GC_MARKED || bits == GC_MARKED_NOESC ) {
915
919
bits = gc_bits (v ) = GC_QUEUED ; // promote
916
920
}
921
+ prev_nold ++ ;
917
922
}
918
923
else {
919
924
assert (bits == GC_MARKED_NOESC );
@@ -939,6 +944,10 @@ static gcval_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl
939
944
pg -> fl_end_offset = pfl_begin ? (char * )pfl - data : (uint16_t )-1 ;
940
945
941
946
pg -> nfree = pg_nfree ;
947
+ if (sweep_mask == GC_MARKED ) {
948
+ pg -> nold = 0 ;
949
+ pg -> prev_nold = prev_nold ;
950
+ }
942
951
page_done ++ ;
943
952
}
944
953
free_page :
0 commit comments