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
|
-module(simple_server_mon).
%% Local process. No timer. Monitor.
-export([start/1, reply/2, stop/1]).
start(State) ->
spawn(fun() -> loop(State) end).
stop(P) ->
P ! {stop, self()},
receive
ok ->
ok
end.
loop(S) ->
receive
{reply, P, Mref, M} ->
P ! {ok, Mref, M},
loop(S);
{stop, P} ->
P ! ok
end.
reply(P, M) ->
Mref = erlang:monitor(process, P),
P ! {reply, self(), Mref, M},
receive
{ok, Mref, M} ->
erlang:demonitor(Mref, [flush]),
ok
end.
|