diff options
| author | Fredrik Gustafsson <[email protected]> | 2013-04-15 14:04:07 +0200 | 
|---|---|---|
| committer | Fredrik Gustafsson <[email protected]> | 2013-04-15 14:04:07 +0200 | 
| commit | 34cfc2bfbf4fdbab0dfafb6dced5e555bb8fa594 (patch) | |
| tree | e36dabcf2fbe49c97178c4c0f6ce4b2375a8c1ba /lib/stdlib/src | |
| parent | efbf57358b8afca275545a627713bcf14969e243 (diff) | |
| parent | 74fdfd48d59393b6f0dfb53f343645133675c64b (diff) | |
| download | otp-34cfc2bfbf4fdbab0dfafb6dced5e555bb8fa594.tar.gz otp-34cfc2bfbf4fdbab0dfafb6dced5e555bb8fa594.tar.bz2 otp-34cfc2bfbf4fdbab0dfafb6dced5e555bb8fa594.zip | |
Merge branch 'maint'
Diffstat (limited to 'lib/stdlib/src')
| -rw-r--r-- | lib/stdlib/src/supervisor.erl | 27 | 
1 files changed, 22 insertions, 5 deletions
| diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl index 9f93747c3e..54328cd9ff 100644 --- a/lib/stdlib/src/supervisor.erl +++ b/lib/stdlib/src/supervisor.erl @@ -63,7 +63,9 @@  %%--------------------------------------------------------------------------  -record(child, {% pid is undefined when child is not running -	        pid = undefined :: child() | {restarting,pid()} | [pid()], +	        pid = undefined :: child() +	                         | {restarting, pid() | undefined} +	                         | [pid()],  		name            :: child_id(),  		mfargs          :: mfargs(),  		restart_type    :: restart(), @@ -752,6 +754,9 @@ restart(Child, State) ->  			 end,  		    timer:apply_after(0,?MODULE,try_again_restart,[self(),Id]),  		    {ok,NState2}; +		{try_again, NState2, #child{name=ChName}} -> +		    timer:apply_after(0,?MODULE,try_again_restart,[self(),ChName]), +		    {ok,NState2};  		Other ->  		    Other  	    end; @@ -798,10 +803,16 @@ restart(rest_for_one, Child, State) ->      case start_children(ChAfter2, State#state.name) of  	{ok, ChAfter3} ->  	    {ok, State#state{children = ChAfter3 ++ ChBefore}}; -	{error, ChAfter3, _Reason} -> +	{error, ChAfter3, {failed_to_start_child, ChName, _Reason}} +	  when ChName =:= Child#child.name ->  	    NChild = Child#child{pid=restarting(Child#child.pid)},  	    NState = State#state{children = ChAfter3 ++ ChBefore}, -	    {try_again, replace_child(NChild,NState)} +	    {try_again, replace_child(NChild,NState)}; +	{error, ChAfter3, {failed_to_start_child, ChName, _Reason}} -> +	    NChild = lists:keyfind(ChName, #child.name, ChAfter3), +	    NChild2 = NChild#child{pid=?restarting(undefined)}, +	    NState = State#state{children = ChAfter3 ++ ChBefore}, +	    {try_again, replace_child(NChild2,NState), NChild2}      end;  restart(one_for_all, Child, State) ->      Children1 = del_child(Child#child.pid, State#state.children), @@ -809,10 +820,16 @@ restart(one_for_all, Child, State) ->      case start_children(Children2, State#state.name) of  	{ok, NChs} ->  	    {ok, State#state{children = NChs}}; -	{error, NChs, _Reason} -> +	{error, NChs, {failed_to_start_child, ChName, _Reason}} +	  when ChName =:= Child#child.name ->  	    NChild = Child#child{pid=restarting(Child#child.pid)},  	    NState = State#state{children = NChs}, -	    {try_again, replace_child(NChild,NState)} +	    {try_again, replace_child(NChild,NState)}; +	{error, NChs, {failed_to_start_child, ChName, _Reason}} -> +	    NChild = lists:keyfind(ChName, #child.name, NChs), +	    NChild2 = NChild#child{pid=?restarting(undefined)}, +	    NState = State#state{children = NChs}, +	    {try_again, replace_child(NChild2,NState), NChild2}      end.  restarting(Pid) when is_pid(Pid) -> ?restarting(Pid); | 
