File: yes_5.erl

package info (click to toggle)
erlang 1%3A14.a-dfsg-3squeeze1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 179,776 kB
  • ctags: 245,237
  • sloc: erlang: 1,066,281; ansic: 260,961; xml: 240,068; cpp: 45,949; makefile: 22,700; sh: 10,897; java: 8,720; lisp: 7,826; python: 5,297; pascal: 3,264; asm: 2,679; perl: 2,514; tcl: 245; sed: 9
file content (46 lines) | stat: -rw-r--r-- 1,057 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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.