From 7b2e433c52e369a37ddfdecb6d82b9dc555a92a5 Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Wed, 16 Nov 2022 16:17:00 -0500 Subject: [PATCH] ensure bindings handle write barriers for ty and globalref (#47580) This has probably been wrong for a long time (since being introduced in 79082468986). (cherry picked from commit b36951160ef0ba8c4641dd768cd7a1f5f570d0a9) --- src/gc.c | 11 ++++++++++- src/module.c | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index 893b76139b7e64..42c4bc84c84604 100644 --- a/src/gc.c +++ b/src/gc.c @@ -3045,8 +3045,17 @@ static void jl_gc_queue_remset(jl_gc_mark_cache_t *gc_cache, jl_gc_mark_sp_t *sp jl_binding_t *ptr = (jl_binding_t*)items[i]; // A null pointer can happen here when the binding is cleaned up // as an exception is thrown after it was already queued (#10221) + int bnd_refyoung = 0; jl_value_t *v = jl_atomic_load_relaxed(&ptr->value); - if (v != NULL && gc_mark_queue_obj(gc_cache, sp, v)) { + if (v != NULL && gc_mark_queue_obj(gc_cache, sp, v)) + bnd_refyoung = 1; + jl_value_t *ty = jl_atomic_load_relaxed(&ptr->ty); + if (ty != NULL && gc_mark_queue_obj(gc_cache, sp, ty)) + bnd_refyoung = 1; + jl_value_t *globalref = jl_atomic_load_relaxed(&ptr->globalref); + if (globalref != NULL && gc_mark_queue_obj(gc_cache, sp, globalref)) + bnd_refyoung = 1; + if (bnd_refyoung) { items[n_bnd_refyoung] = ptr; n_bnd_refyoung++; } diff --git a/src/module.c b/src/module.c index 59731e8b5ba803..0223ba60095cdb 100644 --- a/src/module.c +++ b/src/module.c @@ -419,7 +419,7 @@ JL_DLLEXPORT jl_value_t *jl_module_globalref(jl_module_t *m, jl_sym_t *var) if (jl_atomic_cmpswap_relaxed(&b->globalref, &globalref, newref)) { JL_GC_PROMISE_ROOTED(newref); globalref = newref; - jl_gc_wb(m, globalref); + jl_gc_wb_binding(b, globalref); } } JL_UNLOCK(&m->lock); // may GC