[erlang-questions] question on 'EXIT' messages delivered to exit-trapping gen_servers

Adam Kocoloski adam.kocoloski@REDACTED
Fri Apr 3 04:07:36 CEST 2009


Aha, glad to know I wasn't going crazy.  Thanks Chandru!

Adam

On Apr 2, 2009, at 7:29 PM, Chandru wrote:

> Hi Adam,
>
> It looks like if a gen_server process was spawned using  
> proc_lib:spawn and an EXIT signal is received indicating that the  
> Parent process has died, the terminate() function is called!
>
> The documentation should probably clarify this.
>
> Here is the extract from gen_server.erl in R11B-5
>
> loop(Parent, Name, State, Mod, Time, Debug) ->
>     Msg = receive
>           Input ->
>             Input
>       after Time ->
>           timeout
>       end,
>     case Msg of
>     {system, From, Req} ->
>         sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug,
>                   [Name, State, Mod, Time]);
>     {'EXIT', Parent, Reason} ->
>         terminate(Reason, Name, Msg, Mod, State, Debug);
>     _Msg when Debug =:= [] ->
>         handle_msg(Msg, Parent, Name, State, Mod, Time);
>     _Msg ->
>         Debug1 = sys:handle_debug(Debug, {?MODULE, print_event},
>                       Name, {in, Msg}),
>         handle_msg(Msg, Parent, Name, State, Mod, Time, Debug1)
>     end.
>
> cheers
> Chandru
>
>
> 2009/4/3 Adam Kocoloski <adam.kocoloski@REDACTED>
> Hi Erlangers, I've been doing a little hacking on CouchDB and running
> into some behavior that I don't understand.  We have a standalone
> gen_server (let's call it A) that traps exits and was started by
> another gen_server (B) using start_link.  B does not trap exits, and
> is linked to some other process C.  Now we have the following sequence
> of events:
>
> * exit(C, kill)
> * B exits immediately with Reason killed
> * A calls terminate with Reason killed
>
> That last line surprised me.  I was expecting to receive {'EXIT', B,
> killed} in A's mailbox, and in fact I had written a handle_info to
> process all 'EXIT' messages, but none arrived.  I checked that
> trap_exit is still true in A's terminate.  {trap_exit, true} clearly
> has some effect, as without it terminate isn't even called.
>
> I tried changing the exit signal to some other atom, but I still get
> the same basic results (just with goodbye_cruel_world instead of kill/
> killed in the Reasons).  I'm stumped.  Regards, Adam
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
>




More information about the erlang-questions mailing list