@@ -984,6 +984,7 @@ STATIC_INLINE jl_value_t *jl_gc_big_alloc_inner(jl_ptls_t ptls, size_t sz)
984
984
memset (v , 0xee , allocsz );
985
985
#endif
986
986
v -> sz = allocsz ;
987
+ v -> in_oldest_generation_of_bigvals = 0 ;
987
988
gc_big_object_link (& ptls -> heap .young_generation_of_bigvals , v );
988
989
return jl_valueof (& v -> header );
989
990
}
@@ -1038,6 +1039,7 @@ static void sweep_big_list_of_young_bigvals(bigval_t **young, bigval_t **old) JL
1038
1039
// reached oldest generation, move from young list to old list
1039
1040
gc_big_object_unlink (young , v );
1040
1041
gc_big_object_link (old , v );
1042
+ v -> in_oldest_generation_of_bigvals = 1 ;
1041
1043
}
1042
1044
v -> bits .gc = bits ;
1043
1045
}
@@ -1049,14 +1051,17 @@ static void sweep_big_list_of_young_bigvals(bigval_t **young, bigval_t **old) JL
1049
1051
}
1050
1052
}
1051
1053
1052
- static void sweep_big_list_of_oldest_bigvals (bigval_t * * old ) JL_NOTSAFEPOINT
1054
+ static void sweep_big_list_of_oldest_bigvals (bigval_t * * young , bigval_t * * old ) JL_NOTSAFEPOINT
1053
1055
{
1054
1056
bigval_t * v = * old ;
1055
1057
while (v != NULL ) {
1056
1058
bigval_t * nxt = v -> next ;
1057
1059
int bits = v -> bits .gc ;
1058
1060
int old_bits = bits ;
1059
1061
if (gc_marked (bits )) {
1062
+ gc_big_object_unlink (old , v );
1063
+ gc_big_object_link (young , v );
1064
+ v -> in_oldest_generation_of_bigvals = 0 ;
1060
1065
v -> bits .gc = GC_OLD ;
1061
1066
}
1062
1067
else {
@@ -1082,7 +1087,8 @@ static void sweep_big(jl_ptls_t ptls) JL_NOTSAFEPOINT
1082
1087
for (int i = 0 ; i < gc_n_threads ; i ++ ) {
1083
1088
jl_ptls_t ptls2 = gc_all_tls_states [i ];
1084
1089
if (ptls2 != NULL ) {
1085
- sweep_big_list_of_oldest_bigvals (& ptls2 -> heap .oldest_generation_of_bigvals );
1090
+ sweep_big_list_of_oldest_bigvals (& ptls2 -> heap .young_generation_of_bigvals ,
1091
+ & ptls2 -> heap .oldest_generation_of_bigvals );
1086
1092
}
1087
1093
}
1088
1094
}
@@ -4331,7 +4337,7 @@ jl_value_t *jl_gc_realloc_string(jl_value_t *s, size_t sz)
4331
4337
jl_ptls_t ptls = jl_current_task -> ptls ;
4332
4338
maybe_collect (ptls ); // don't want this to happen during jl_gc_managed_realloc
4333
4339
bigval_t * * p_head ;
4334
- if (hdr -> bits . gc == GC_OLD_MARKED ) {
4340
+ if (hdr -> in_oldest_generation_of_bigvals ) {
4335
4341
p_head = & ptls -> heap .oldest_generation_of_bigvals ;
4336
4342
}
4337
4343
else {
0 commit comments