aboutsummaryrefslogtreecommitdiffstats
path: root/erts/lib_src/utils/make_atomics_api
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2012-03-08 10:08:08 +0100
committerRickard Green <[email protected]>2012-03-12 13:35:05 +0100
commitd534b746e9f1c8aee9180a216066c4abfb24caed (patch)
treece28e37d21da55d82525110be77a1437cce4b4a8 /erts/lib_src/utils/make_atomics_api
parentb8e572a1d755e5b90dfc9aedb49e21862376ea7d (diff)
downloadotp-d534b746e9f1c8aee9180a216066c4abfb24caed.tar.gz
otp-d534b746e9f1c8aee9180a216066c4abfb24caed.tar.bz2
otp-d534b746e9f1c8aee9180a216066c4abfb24caed.zip
Fix implementation with ddrb barriers
Diffstat (limited to 'erts/lib_src/utils/make_atomics_api')
-rwxr-xr-xerts/lib_src/utils/make_atomics_api27
1 files changed, 26 insertions, 1 deletions
diff --git a/erts/lib_src/utils/make_atomics_api b/erts/lib_src/utils/make_atomics_api
index 75e88f8a7e..74736c5a2d 100755
--- a/erts/lib_src/utils/make_atomics_api
+++ b/erts/lib_src/utils/make_atomics_api
@@ -805,7 +805,7 @@ rtchk_fallback_call(Return, #atomic_context{dw = DW,
non_native_barrier(B) ->
lists:member(B, ?NON_NATIVE_BARRIERS).
-non_native_barrier_impl(AC, Type, Op, B) ->
+non_native_barrier_impl(AC, inline_implementation = Type, Op, B) ->
["
", func_header(AC, Type, false, Op, B), "
{",
@@ -822,11 +822,36 @@ non_native_barrier_impl(AC, Type, Op, B) ->
end,
"}
"
+ ];
+non_native_barrier_impl(#atomic_context{have_native_atomic_ops = HaveNative} = AC,
+ implementation = Type,
+ Op,
+ B) ->
+ ["
+", func_header(AC, Type, false, Op, B), "
+{",
+ case B of
+ ddrb ->
+ ["
+#if defined(", HaveNative, ")
+ ", func_call(AC, Type, Op, B, true), "
+#elif defined(ETHR_ORDERED_READ_DEPEND)
+ ", func_call(AC, symbol_implementation, Op, none, true), "
+#else
+ ", func_call(AC, symbol_implementation, Op, rb, true), "
+#endif
+"
+ ]
+ end,
+ "}
+"
].
func_call(#atomic_context{'ATMC' = ATMC} = AC, inline_implementation, Op, B, RetStatement) ->
func_call(AC, Op, ["ETHR_", ATMC, "_FUNC__(", opstr(Op), op_barrier_ext(B), ")"], RetStatement);
func_call(#atomic_context{atomic = Atomic} = AC, implementation, Op, B, RetStatement) ->
+ func_call(AC, Op, [Atomic, "_", opstr(Op), op_barrier_ext(B), "__"], RetStatement);
+func_call(#atomic_context{atomic = Atomic} = AC, symbol_implementation, Op, B, RetStatement) ->
func_call(AC, Op, [Atomic, "_", opstr(Op), op_barrier_ext(B)], RetStatement).
func_call(#atomic_context{dw = DW, arg1 = Arg1, arg2 = Arg2, arg3 = Arg3} = AC, Op, Func, true) ->