Skip to content

Commit 5e79317

Browse files
d-nettoKristofferC
authored andcommitted
gc: fix conservative GC support (#50533)
Ensure `internal_obj_base_ptr` checks whether objects past freelist pointer are in freelist. Fixes #50434 (cherry picked from commit dcca46b)
1 parent 8827eb3 commit 5e79317

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

src/gc.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,10 @@ static NOINLINE jl_taggedvalue_t *gc_add_page(jl_gc_pool_t *p) JL_NOTSAFEPOINT
12421242
// in pool_alloc significantly
12431243
jl_ptls_t ptls = jl_current_task->ptls;
12441244
jl_gc_pagemeta_t *pg = pop_page_metadata_back(&ptls->page_metadata_lazily_freed);
1245-
if (pg == NULL) {
1245+
if (pg != NULL) {
1246+
gc_alloc_map_set(pg->data, GC_PAGE_ALLOCATED);
1247+
}
1248+
else {
12461249
pg = jl_gc_alloc_page();
12471250
}
12481251
pg->osize = p->osize;
@@ -1449,6 +1452,7 @@ static jl_taggedvalue_t **gc_sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t **allo
14491452
push_page_metadata_back(allocd, pg);
14501453
}
14511454
else if (freed_lazily) {
1455+
gc_alloc_map_set(pg->data, GC_PAGE_LAZILY_FREED);
14521456
push_page_metadata_back(lazily_freed, pg);
14531457
}
14541458
else {
@@ -4024,7 +4028,7 @@ JL_DLLEXPORT jl_value_t *jl_gc_internal_obj_base_ptr(void *p)
40244028
jl_gc_pool_t *pool =
40254029
gc_all_tls_states[meta->thread_n]->heap.norm_pools +
40264030
meta->pool_n;
4027-
if (meta->fl_begin_offset == (uint16_t) -1) {
4031+
if (meta->fl_begin_offset == UINT16_MAX) {
40284032
// case 2: this is a page on the newpages list
40294033
jl_taggedvalue_t *newpages = pool->newpages;
40304034
// Check if the page is being allocated from via newpages
@@ -4066,8 +4070,18 @@ JL_DLLEXPORT jl_value_t *jl_gc_internal_obj_base_ptr(void *p)
40664070
// before the freelist pointer was either live during the last
40674071
// sweep or has been allocated since.
40684072
if (gc_page_data(cell) == gc_page_data(pool->freelist)
4069-
&& (char *)cell < (char *)pool->freelist)
4073+
&& (char *)cell < (char *)pool->freelist) {
40704074
goto valid_object;
4075+
}
4076+
else {
4077+
jl_taggedvalue_t *v = pool->freelist;
4078+
while (v != NULL) {
4079+
if (v == cell) {
4080+
return NULL;
4081+
}
4082+
v = v->next;
4083+
}
4084+
}
40714085
// Not a freelist entry, therefore a valid object.
40724086
valid_object:
40734087
// We have to treat objects with type `jl_buff_tag` differently,

0 commit comments

Comments
 (0)