diff options
author | John Hodge <tpg@mutabah.net> | 2018-12-22 14:19:37 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2018-12-22 14:19:37 +0800 |
commit | b141095b38ac0ea5a7ed58aa405afd1c318aa442 (patch) | |
tree | 737ba26069bac6515470f025d3cd304b30fdc4c0 /src | |
parent | 53e6ea256d88e5a0e457a294c3d85b1cbaea0386 (diff) | |
download | mrust-b141095b38ac0ea5a7ed58aa405afd1c318aa442.tar.gz |
Codegen C - Fix incorrect memory orderings
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 5 |
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" ; |