summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-12-22 14:19:37 +0800
committerJohn Hodge <tpg@mutabah.net>2018-12-22 14:19:37 +0800
commitb141095b38ac0ea5a7ed58aa405afd1c318aa442 (patch)
tree737ba26069bac6515470f025d3cd304b30fdc4c0 /src
parent53e6ea256d88e5a0e457a294c3d85b1cbaea0386 (diff)
downloadmrust-b141095b38ac0ea5a7ed58aa405afd1c318aa442.tar.gz
Codegen C - Fix incorrect memory orderings
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index a1b3d065..8bbbd033 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -313,9 +313,10 @@ namespace {
{
m_of
<< "static inline uint"<<sz<<"_t __mrustc_atomicloop"<<sz<<"(volatile uint"<<sz<<"_t* slot, uint"<<sz<<"_t param, int ordering, uint"<<sz<<"_t (*cb)(uint"<<sz<<"_t, uint"<<sz<<"_t)) {"
+ << " int ordering_load = (ordering == memory_order_release || ordering == memory_order_acq_rel ? memory_order_relaxed : ordering);" // If Release, Load with Relaxed
<< " for(;;) {"
- << " uint"<<sz<<"_t v = atomic_load_explicit((_Atomic uint"<<sz<<"_t*)slot, ordering);"
- << " if( atomic_compare_exchange_strong_explicit((_Atomic uint"<<sz<<"_t*)slot, &v, cb(v, param), ordering, ordering) ) return v;"
+ << " uint"<<sz<<"_t v = atomic_load_explicit((_Atomic uint"<<sz<<"_t*)slot, ordering_load);"
+ << " if( atomic_compare_exchange_strong_explicit((_Atomic uint"<<sz<<"_t*)slot, &v, cb(v, param), ordering, ordering_load) ) return v;"
<< " }"
<< "}\n"
;