Skip to content

Commit d7eced9

Browse files
committed
ARM64: add atomic_thread_fence(memory_order_release) to ensure 'dmb ish' for caml_atomic_exchange, caml_atomic_cas_field, caml_atomic_cas and caml_atomic_fetch_add
1 parent cb84eb0 commit d7eced9

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

runtime/memory.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ CAMLexport int caml_atomic_cas_field (
234234
} else {
235235
/* need a real CAS */
236236
atomic_value* p = &Op_atomic_val(obj)[field];
237-
if (atomic_compare_exchange_strong(p, &oldval, newval)) {
237+
int cas_ret = atomic_compare_exchange_strong(p, &oldval, newval);
238+
atomic_thread_fence(memory_order_release); /* generates `dmb ish` */
239+
if (cas_ret) {
238240
write_barrier(obj, field, oldval, newval);
239241
return 1;
240242
} else {
@@ -268,6 +270,7 @@ CAMLprim value caml_atomic_exchange (value ref, value v)
268270
/* See Note [MM] above */
269271
atomic_thread_fence(memory_order_acquire);
270272
ret = atomic_exchange(Op_atomic_val(ref), v);
273+
atomic_thread_fence(memory_order_release); /* generates `dmb ish` */
271274
}
272275
write_barrier(ref, 0, ret, v);
273276
return ret;
@@ -286,7 +289,9 @@ CAMLprim value caml_atomic_cas (value ref, value oldv, value newv)
286289
}
287290
} else {
288291
atomic_value* p = &Op_atomic_val(ref)[0];
289-
if (atomic_compare_exchange_strong(p, &oldv, newv)) {
292+
int cas_ret = atomic_compare_exchange_strong(p, &oldv, newv);
293+
atomic_thread_fence(memory_order_release); /* generates `dmb ish` */
294+
if (cas_ret) {
290295
write_barrier(ref, 0, oldv, newv);
291296
return Val_int(1);
292297
} else {
@@ -307,6 +312,7 @@ CAMLprim value caml_atomic_fetch_add (value ref, value incr)
307312
} else {
308313
atomic_value *p = &Op_atomic_val(ref)[0];
309314
ret = atomic_fetch_add(p, 2*Long_val(incr));
315+
atomic_thread_fence(memory_order_release); /* generates `dmb ish` */
310316
}
311317
return ret;
312318
}

0 commit comments

Comments
 (0)