File 1138-Avoid-potential-timer-bottleneck-on-supervisor-resta.patch of Package erlang

From 44d5789619c70863af918ee5e2bdd7d411e68e80 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@plataformatec.com.br>
Date: Thu, 31 Mar 2016 10:48:11 +0200
Subject: [PATCH] Avoid potential timer bottleneck on supervisor restart

Prior to this patch, when the supervisor was unable to
restart a child, it used the timer process to execute
a function later on, allowing other messages in the
supervisor queue to be consumed.

This patch keeps the same idea but bypasses the timer
process by directly sending a message to the supervisor
process itself.
---
 lib/stdlib/src/supervisor.erl | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl
index 0400c84..9d783af 100644
--- a/lib/stdlib/src/supervisor.erl
+++ b/lib/stdlib/src/supervisor.erl
@@ -246,7 +246,7 @@ check_childspecs(ChildSpecs) when is_list(ChildSpecs) ->
 check_childspecs(X) -> {error, {badarg, X}}.
 
 %%%-----------------------------------------------------------------
-%%% Called by timer:apply_after from restart/2
+%%% Called by restart/2
 -spec try_again_restart(SupRef, Child) -> ok when
       SupRef :: sup_ref(),
       Child :: child_id() | pid().
@@ -571,8 +571,8 @@ count_child(#child{pid = Pid, child_type = supervisor},
     end.
 
 
-%%% If a restart attempt failed, this message is sent via
-%%% timer:apply_after(0,...) in order to give gen_server the chance to
+%%% If a restart attempt failed, this message is cast
+%%% from restart/2 in order to give gen_server the chance to
 %%% check it's inbox before trying again.
 -spec handle_cast({try_again_restart, child_id() | pid()}, state()) ->
 			 {'noreply', state()} | {stop, shutdown, state()}.
@@ -790,16 +790,10 @@ restart(Child, State) ->
 		    Id = if ?is_simple(State) -> Child#child.pid;
 			    true -> Child#child.name
 			 end,
-		    {ok, _TRef} = timer:apply_after(0,
-                                                    ?MODULE,
-                                                    try_again_restart,
-                                                    [self(),Id]),
+		    ok = try_again_restart(self(), Id),
 		    {ok,NState2};
 		{try_again, NState2, #child{name=ChName}} ->
-		    {ok, _TRef} = timer:apply_after(0,
-						    ?MODULE,
-						    try_again_restart,
-						    [self(),ChName]),
+		    ok = try_again_restart(self(), ChName),
 		    {ok,NState2};
 		Other ->
 		    Other
-- 
2.1.4

openSUSE Build Service is sponsored by