-
-
Notifications
You must be signed in to change notification settings - Fork 66
Description
The actor.start
function now uses the proc_lib:spawn_link
function that creates a link between the parent and actor.
In the start sequence the parent will monitor the starting actor and receive any DOWN
message and return an error.
The problem is if the parent is a supervisor that traps EXIT
, it will receive an EXIT
message because of the link as well as the error returned and may decide to restart the child, maybe ending up in a cyclic behaviour.
When receiving a DOWN
message one should try to flush the EXIT similar to what is done in the erlang gen_server:start_link
sequence in sync_start sequence in erlang proc_lib
module.
Actions is to write a test with a parent trapping exits (and/or supervisor) and an actor exiting in the startup to verify that both DOWN and EXIT messages are sent to the parent and, if necessary, add code to flush the EXIT
when DOWN
is received.
Corresponding Erlang code to flush the EXIT
:
%% After an unlink(Pid) an {'EXIT', Pid, _} link message
%% cannot arrive so receive after 0 will work,
flush_EXIT(Pid) ->
unlink(Pid),
receive {'EXIT', Pid, _} -> ok after 0 -> ok end.