erlang:monitor can hang under certain conditions
Mickael Remond
mickael.remond@REDACTED
Sun Nov 20 21:49:45 CET 2005
Hello,
The following problem has been brought to my attention:
If this happen to be really a bug, it could trigger deadlock when using
Erlang monitor for a disappered process.
The ProcessId is a local processid, but the node has changed in the
meantime. It seems to confuse the monitor.
Here is how to reproduce it.
************ ping.erl *******************
-module(ping).
-export([start/0,loop/1]).
start() ->
register(ping,spawn(ping,loop,[initial])).
loop(X) ->
receive
{store, Y} -> loop(Y);
{retrieve, Pid} when pid(Pid) -> Pid ! X, loop(X)
end.
****************************************
First time, the Erlang monitor is not hanging:
$ erl -sname ping -s ping -detached
$ erl -sname hanger
Erlang (BEAM) emulator version 5.4.4 [source] [threads:0]
Eshell V5.4.4 (abort with ^G)
(hanger@REDACTED)1> OldPid = spawn(io, format, ["ok",""]).
ok<0.37.0>
...
(hanger@REDACTED)4> {ping, 'ping@REDACTED'} !
{store, OldPid}.
{store,<0.37.0>}
(hanger@REDACTED)5> {ping, 'ping@REDACTED'} !
{retrieve, self()}.
{retrieve,<0.42.0>}
(hanger@REDACTED)6> RetPid = receive X -> X end.
<0.37.0>
(hanger@REDACTED)7> erlang:monitor(process,RetPid).
#Ref<0.0.0.68>
(hanger@REDACTED)8> halt().
Second time:
erl -sname hanger
Erlang (BEAM) emulator version 5.4.4 [source] [threads:0]
Eshell V5.4.4 (abort with ^G)
(hanger@REDACTED)1> {ping, 'ping@REDACTED'} !
{retrieve, self()}.
{retrieve,<0.35.0>}
(hanger@REDACTED)2> RetPid = receive X -> X end.
<0.37.0>
(hanger@REDACTED)3> RetPid.
<0.37.0>
(hanger@REDACTED)4> erlang:monitor(process,RetPid).
The function never returns.
I have started looking at the Erlang code to analyze more deeply the
problem, but I thought that it might be interesting to share the
information.
Cheers,
--
Mickaël Rémond
http://www.process-one.net/
More information about the erlang-questions
mailing list