Skip to content

Commit a271d93

Browse files
committed
use field to indicate in oldest generation of bigvals
1 parent 2b36364 commit a271d93

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

src/gc.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,7 @@ STATIC_INLINE jl_value_t *jl_gc_big_alloc_inner(jl_ptls_t ptls, size_t sz)
984984
memset(v, 0xee, allocsz);
985985
#endif
986986
v->sz = allocsz;
987+
v->in_oldest_generation_of_bigvals = 0;
987988
gc_big_object_link(&ptls->heap.young_generation_of_bigvals, v);
988989
return jl_valueof(&v->header);
989990
}
@@ -1038,6 +1039,7 @@ static void sweep_big_list_of_young_bigvals(bigval_t **young, bigval_t **old) JL
10381039
// reached oldest generation, move from young list to old list
10391040
gc_big_object_unlink(young, v);
10401041
gc_big_object_link(old, v);
1042+
v->in_oldest_generation_of_bigvals = 1;
10411043
}
10421044
v->bits.gc = bits;
10431045
}
@@ -1049,14 +1051,17 @@ static void sweep_big_list_of_young_bigvals(bigval_t **young, bigval_t **old) JL
10491051
}
10501052
}
10511053

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
10531055
{
10541056
bigval_t *v = *old;
10551057
while (v != NULL) {
10561058
bigval_t *nxt = v->next;
10571059
int bits = v->bits.gc;
10581060
int old_bits = bits;
10591061
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;
10601065
v->bits.gc = GC_OLD;
10611066
}
10621067
else {
@@ -1082,7 +1087,8 @@ static void sweep_big(jl_ptls_t ptls) JL_NOTSAFEPOINT
10821087
for (int i = 0; i < gc_n_threads; i++) {
10831088
jl_ptls_t ptls2 = gc_all_tls_states[i];
10841089
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);
10861092
}
10871093
}
10881094
}
@@ -4331,7 +4337,7 @@ jl_value_t *jl_gc_realloc_string(jl_value_t *s, size_t sz)
43314337
jl_ptls_t ptls = jl_current_task->ptls;
43324338
maybe_collect(ptls); // don't want this to happen during jl_gc_managed_realloc
43334339
bigval_t **p_head;
4334-
if (hdr->bits.gc == GC_OLD_MARKED) {
4340+
if (hdr->in_oldest_generation_of_bigvals) {
43354341
p_head = &ptls->heap.oldest_generation_of_bigvals;
43364342
}
43374343
else {

src/gc.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,13 @@ JL_EXTENSION typedef struct _bigval_t {
126126
struct _bigval_t *next;
127127
struct _bigval_t *prev;
128128
size_t sz;
129+
size_t in_oldest_generation_of_bigvals;
129130
#ifdef _P64 // Add padding so that the value is 64-byte aligned
130-
// (8 pointers of 8 bytes each) - (4 other pointers in struct)
131-
void *_padding[8 - 4];
131+
// (8 pointers of 8 bytes each) - (5 other pointers in struct)
132+
void *_padding[8 - 5];
132133
#else
133-
// (16 pointers of 4 bytes each) - (4 other pointers in struct)
134-
void *_padding[16 - 4];
134+
// (16 pointers of 4 bytes each) - (5 other pointers in struct)
135+
void *_padding[16 - 5];
135136
#endif
136137
//struct jl_taggedvalue_t <>;
137138
union {

0 commit comments

Comments
 (0)