From whence do monitors come?

Matthew Sackman <>
Fri Sep 10 15:07:58 CEST 2010

gen.erl has the following code in do_call:

	    catch erlang:send(Process, {Label, {self(), Mref}, Request},
		{Mref, Reply} ->
		    erlang:demonitor(Mref, [flush]),
		    {ok, Reply};
		{'DOWN', Mref, _, _, noconnection} ->
		    exit({nodedown, Node});
		{'DOWN', Mref, _, _, Reason} ->

If the callee is something like a gen_server, and on handling that msg
returns a {stop, Reply, Reason, State} quple, there seems to be a race
between the reply and the monitor. Or more simply, say the callee does
something like:

receive {'$gen_call', From, _Msg} -> gen_server:reply(From, done) end.

There seems to be a race - what's stopping the DOWN from the monitor
overtaking the reply from the callee?

The only thing that I can think of is that the DOWN is considered to
come *from* the callee. Is that right?


More information about the erlang-questions mailing list