loop exit question
Ulf Wiger
etxuwig@REDACTED
Thu Apr 19 15:40:06 CEST 2001
On Thu, 19 Apr 2001, Willem Broekema wrote:
>Now, if the State is not changed in any of the 'reveiced'
>branches, is there a reason not to move the final 'loop()'
>command to the end, and use 'exit()' for breaking out of
>the loop, like in the following?
>
>loop2(State) ->
> receive
> stop ->
> exit(self(), stopped_upon_request);
> Other ->
> ...
> end,
> loop(State).
How you want to terminate your process depends in part on how you're
implementing it (plain erlang, gen_server, 'sys' compliant plain
erlang, ...), and in part on the context in which it is executing.
I would write the loop like this:
loop2(State) ->
receive
stop ->
terminate(normal, State);
Other ->
NewState = handle_message(Other, State),
loop2(NewState)
end.
terminate(Reason, State) ->
exit(Reason). %% note: exit/1
handle_message(Msg, State) ->
...
I will give a few examples of context issues to consider:
- if you're using SASL, and the process was started with e.g.
proc_lib:spawn_link/3 (as it should), exit(stopped_upon_request)
would be interpreted as an abnormal exit, and would lead to a
crash report. exit(normal) would not.
- If the process is supervised, and is started as a transient
process, any exit reason other than normal would cause the
supervisor to restart the process.
- If the process is supervised and trapping EXITs, it would
have to trap the following message:
receive
{'EXIT', Parent, shutdown} -> %% assume Parent is bound
terminate(shutdown, State);
...
end.
This in order to comply with the OTP shutdown protocol.
Of course, if you use an OTP behaviour, like gen_server, you get
much of this for free.
/Uffe
--
Ulf Wiger tfn: +46 8 719 81 95
Senior System Architect mob: +46 70 519 81 95
Strategic Product & System Management ATM Multiservice Networks
Data Backbone & Optical Services Division Ericsson Telecom AB
More information about the erlang-questions
mailing list