diff options
author | Björn Gustavsson <[email protected]> | 2010-04-22 13:37:18 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-05-11 08:54:26 +0200 |
commit | f39e0b6bbc5f5d9f6a55b87847bcad7707309883 (patch) | |
tree | 716d2cd1cfa00e1854ccba637484c8a7aec68919 /lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl | |
parent | 1d3148a8532b9319265fbe4107cdde81b554b3a2 (diff) | |
download | otp-f39e0b6bbc5f5d9f6a55b87847bcad7707309883.tar.gz otp-f39e0b6bbc5f5d9f6a55b87847bcad7707309883.tar.bz2 otp-f39e0b6bbc5f5d9f6a55b87847bcad7707309883.zip |
compiler test: Test optimization of receive statements
We don't attempt to run the generated code, but use beam_disasm
and check for the presence or absence (as appropriate) of the
recv_mark/1 and recv_set/1 instructions.
Diffstat (limited to 'lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl')
-rw-r--r-- | lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl new file mode 100644 index 0000000000..3f02fba6a6 --- /dev/null +++ b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_5.erl @@ -0,0 +1,46 @@ +-module(yes_5). +-compile(export_all). + +?MODULE() -> + ok. + +do_call(Process, Label, Request, Timeout) -> + Node = case Process of + {_S, N} when is_atom(N) -> + N; + _ when is_pid(Process) -> + node(Process) + end, + try erlang:monitor(process, Process) of + Mref -> + catch erlang:send(Process, {Label, {self(), Mref}, Request}, + [noconnect]), + receive + {Mref, Reply} -> + erlang:demonitor(Mref, [flush]), + {ok, Reply}; + {'DOWN', Mref, _, _, noconnection} -> + exit({nodedown, Node}); + {'DOWN', Mref, _, _, Reason} -> + exit(Reason) + after Timeout -> + erlang:demonitor(Mref), + receive + {'DOWN', Mref, _, _, _} -> true + after 0 -> true + end, + exit(timeout) + end + catch + error:_ -> + monitor_node(Node, true), + receive + {nodedown, Node} -> + monitor_node(Node, false), + exit({nodedown, Node}) + after 0 -> + Tag = make_ref(), + Process ! {Label, {self(), Tag}, Request}, + ?MODULE:wait_resp(Node, Tag, Timeout) + end + end. |