Skip to content

Commit f4534d1

Browse files
authored
strengthen setglobal to default to release-consume ordering (#47742)
In looking at a TSAN report recently, I noticed that globals were getting stored as atomic-unordered (since c92ab5e #44182), instead of atomic-release as intended (since 46135df #45484).
1 parent 060a492 commit f4534d1

File tree

2 files changed

+4
-3
lines changed

2 files changed

+4
-3
lines changed

src/builtins.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,7 +1201,7 @@ JL_CALLABLE(jl_f_getglobal)
12011201

12021202
JL_CALLABLE(jl_f_setglobal)
12031203
{
1204-
enum jl_memory_order order = jl_memory_order_monotonic;
1204+
enum jl_memory_order order = jl_memory_order_release;
12051205
JL_NARGS(setglobal!, 3, 4);
12061206
if (nargs == 4) {
12071207
JL_TYPECHK(setglobal!, symbol, args[3]);

src/codegen.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2881,6 +2881,7 @@ static bool emit_f_opglobal(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f,
28812881
const jl_cgval_t &sym = argv[2];
28822882
const jl_cgval_t &val = argv[3];
28832883
enum jl_memory_order order = jl_memory_order_unspecified;
2884+
assert(f == jl_builtin_setglobal && modifyop == nullptr && "unimplemented");
28842885

28852886
if (nargs == 4) {
28862887
const jl_cgval_t &arg4 = argv[4];
@@ -2890,7 +2891,7 @@ static bool emit_f_opglobal(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f,
28902891
return false;
28912892
}
28922893
else
2893-
order = jl_memory_order_monotonic;
2894+
order = jl_memory_order_release;
28942895

28952896
if (order == jl_memory_order_invalid || order == jl_memory_order_notatomic) {
28962897
emit_atomic_error(ctx, order == jl_memory_order_invalid ? "invalid atomic ordering" : "setglobal!: module binding cannot be written non-atomically");
@@ -4690,7 +4691,7 @@ static void emit_assignment(jl_codectx_t &ctx, jl_value_t *l, jl_value_t *r, ssi
46904691
bp = global_binding_pointer(ctx, jl_globalref_mod(l), jl_globalref_name(l), &bnd, true);
46914692
}
46924693
if (bp != NULL) {
4693-
emit_globalset(ctx, bnd, bp, rval_info, AtomicOrdering::Unordered);
4694+
emit_globalset(ctx, bnd, bp, rval_info, AtomicOrdering::Release);
46944695
// Global variable. Does not need debug info because the debugger knows about
46954696
// its memory location.
46964697
}

0 commit comments

Comments
 (0)