Skip to content

Commit 9d1cedb

Browse files
authored
Restore JL_NOTSAFEPOINT in jl_stderr_obj (JuliaLang#56407)
This is not a function we're really using, but it's used in the embedding examples, so I'm sure somebody would complain if I deleted it or made it a safepoint, so let's just give the same best-effort result as before.
1 parent 10a1d6f commit 9d1cedb

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/julia.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,7 @@ JL_DLLEXPORT jl_sym_t *jl_tagged_gensym(const char *str, size_t len);
18541854
JL_DLLEXPORT jl_sym_t *jl_get_root_symbol(void);
18551855
JL_DLLEXPORT jl_value_t *jl_get_binding_value(jl_binding_t *b JL_PROPAGATES_ROOT);
18561856
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_const(jl_binding_t *b JL_PROPAGATES_ROOT);
1857+
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved(jl_binding_t *b JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT;
18571858
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved_and_const(jl_binding_t *b JL_PROPAGATES_ROOT) JL_NOTSAFEPOINT;
18581859
JL_DLLEXPORT jl_value_t *jl_declare_const_gf(jl_binding_t *b, jl_module_t *mod, jl_sym_t *name);
18591860
JL_DLLEXPORT jl_method_t *jl_method_def(jl_svec_t *argdata, jl_methtable_t *mt, jl_code_info_t *f, jl_module_t *module);

src/module.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,28 @@ JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved_and_const(jl_binding_t
360360
return decode_restriction_value(pku);
361361
}
362362

363+
JL_DLLEXPORT jl_value_t *jl_get_binding_value_if_resolved(jl_binding_t *b)
364+
{
365+
// Unlike jl_get_binding_value this doesn't try to allocate new binding partitions if they
366+
// don't already exist, making this JL_NOTSAFEPOINT.
367+
if (!b)
368+
return NULL;
369+
jl_binding_partition_t *bpart = jl_atomic_load_relaxed(&b->partitions);
370+
if (!bpart)
371+
return NULL;
372+
size_t max_world = jl_atomic_load_relaxed(&bpart->max_world);
373+
if (bpart->min_world > jl_current_task->world_age || jl_current_task->world_age > max_world)
374+
return NULL;
375+
jl_ptr_kind_union_t pku = jl_atomic_load_relaxed(&bpart->restriction);
376+
if (jl_bkind_is_some_guard(decode_restriction_kind(pku)))
377+
return NULL;
378+
if (jl_bkind_is_some_import(decode_restriction_kind(pku)))
379+
return NULL;
380+
if (jl_bkind_is_some_constant(decode_restriction_kind(pku)))
381+
return decode_restriction_value(pku);
382+
return jl_atomic_load_relaxed(&b->value);
383+
}
384+
363385
JL_DLLEXPORT jl_value_t *jl_bpart_get_restriction_value(jl_binding_partition_t *bpart)
364386
{
365387
jl_ptr_kind_union_t pku = jl_atomic_load_relaxed(&bpart->restriction);

src/rtutils.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ JL_DLLEXPORT jl_value_t *jl_stderr_obj(void) JL_NOTSAFEPOINT
567567
if (jl_base_module == NULL)
568568
return NULL;
569569
jl_binding_t *stderr_obj = jl_get_module_binding(jl_base_module, jl_symbol("stderr"), 0);
570-
return stderr_obj ? jl_get_binding_value(stderr_obj) : NULL;
570+
return stderr_obj ? jl_get_binding_value_if_resolved(stderr_obj) : NULL;
571571
}
572572

573573
// toys for debugging ---------------------------------------------------------

0 commit comments

Comments
 (0)