File 4507-Add-supervisor-check_childspecs-2.patch of Package erlang

From 405656e0005944cef49082ff60ded9905e0ca325 Mon Sep 17 00:00:00 2001
From: juhlig <juhlig@hnc-agency.org>
Date: Tue, 6 Apr 2021 13:06:25 +0200
Subject: [PATCH 07/13] Add supervisor:check_childspecs/2

---
 lib/stdlib/src/supervisor.erl        | 33 ++++++++++++++++++-----
 lib/stdlib/test/supervisor_SUITE.erl | 39 +++++++++++++++++-----------
 2 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl
index a26a8654f7..1ee7f1bd35 100644
--- a/lib/stdlib/src/supervisor.erl
+++ b/lib/stdlib/src/supervisor.erl
@@ -26,7 +26,8 @@
 	 start_child/2, restart_child/2,
 	 delete_child/2, terminate_child/2,
 	 which_children/1, count_children/1,
-	 check_childspecs/1, get_childspec/2]).
+	 check_childspecs/1, check_childspecs/2,
+	 get_childspec/2]).
 
 %% Internal exports
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -264,12 +265,32 @@ call(Supervisor, Req) ->
 -spec check_childspecs(ChildSpecs) -> Result when
       ChildSpecs :: [child_spec()],
       Result :: 'ok' | {'error', Error :: term()}.
-check_childspecs(ChildSpecs) when is_list(ChildSpecs) ->
-    case check_startspec(ChildSpecs, undefined) of
+check_childspecs(ChildSpecs) ->
+    check_childspecs(ChildSpecs, undefined).
+
+-spec check_childspecs(ChildSpecs, AutoShutdown) -> Result when
+      ChildSpecs :: [child_spec()],
+      AutoShutdown :: undefined | auto_shutdown(),
+      Result :: 'ok' | {'error', Error :: term()}.
+check_childspecs(ChildSpecs, AutoShutdown) when is_list(ChildSpecs) ->
+    check_childspecs1(ChildSpecs, AutoShutdown);
+check_childspecs(X, _AutoShutdown) -> {error, {badarg, X}}.
+
+check_childspecs1(ChildSpecs, undefined) ->
+    check_childspecs2(ChildSpecs, undefined);
+check_childspecs1(ChildSpecs, never) ->
+    check_childspecs2(ChildSpecs, never);
+check_childspecs1(ChildSpecs, any_significant) ->
+    check_childspecs2(ChildSpecs, any_significant);
+check_childspecs1(ChildSpecs, all_significant) ->
+    check_childspecs2(ChildSpecs, all_significant);
+check_childspecs1(_, X) -> {error, {badarg, X}}.
+
+check_childspecs2(ChildSpecs, AutoShutdown) ->
+    case check_startspec(ChildSpecs, AutoShutdown) of
 	{ok, _} -> ok;
 	Error -> {error, Error}
-    end;
-check_childspecs(X) -> {error, {badarg, X}}.
+    end.
 
 %%%-----------------------------------------------------------------
 %%% Called by release_handler during upgrade
@@ -733,7 +754,7 @@ do_restart(Reason, Child, State) when ?is_temporary(Child) ->
 
 do_auto_shutdown(_Child, State=#state{auto_shutdown = never}) ->
     {ok, State};
-do_auto_shutdown(Child, State) when not ?is_significant(Child)->
+do_auto_shutdown(Child, State) when not ?is_significant(Child) ->
     {ok, State};
 do_auto_shutdown(_Child, State=#state{auto_shutdown = any_significant}) ->
     {shutdown, State};
diff --git a/lib/stdlib/test/supervisor_SUITE.erl b/lib/stdlib/test/supervisor_SUITE.erl
index 7a3dfbc347..827ee71f36 100644
--- a/lib/stdlib/test/supervisor_SUITE.erl
+++ b/lib/stdlib/test/supervisor_SUITE.erl
@@ -806,26 +806,35 @@ child_specs_map(Config) when is_list(Config) ->
     {error, {invalid_significant, maybe}} =
 	supervisor:check_childspecs([B10]),
 
+    CSFilter = fun (CS) -> maps:filter(fun (_, V) -> V =/= undefined end, CS) end,
     lists:foreach(
 	fun
-	    (ChildSpec = #{restart := undefined, significant := true}) ->
-		ChildSpec1 = maps:filter(fun (_, V) -> V =/= undefined end, ChildSpec),
-		{error, {invalid_significant, true}} = supervisor:check_childspecs([ChildSpec1]);
-	    (ChildSpec = #{restart := permanent, significant := true}) ->
-		ChildSpec1 = maps:filter(fun (_, V) -> V =/= undefined end, ChildSpec),
-		{error, {invalid_significant, true}} = supervisor:check_childspecs([ChildSpec1]);
-	    (ChildSpec) ->
-		ChildSpec1 = maps:filter(fun (_, V) -> V =/= undefined end, ChildSpec),
-		ok = supervisor:check_childspecs([ChildSpec1])
+	    ({never, ChildSpec = #{significant := true}}) ->
+		ChildSpec1 = CSFilter(ChildSpec),
+		{error, {invalid_significant, true}} =
+		    supervisor:check_childspecs([ChildSpec1], never);
+	    ({AutoShutdown, ChildSpec = #{restart := undefined, significant := true}}) ->
+		ChildSpec1 = CSFilter(ChildSpec),
+		{error, {invalid_significant, true}} =
+		    supervisor:check_childspecs([ChildSpec1], AutoShutdown);
+	    ({AutoShutdown, ChildSpec = #{restart := permanent, significant := true}}) ->
+		ChildSpec1 = CSFilter(ChildSpec),
+		{error, {invalid_significant, true}} =
+		    supervisor:check_childspecs([ChildSpec1], AutoShutdown);
+	    ({AutoShutdown, ChildSpec}) ->
+		ChildSpec1 = CSFilter(ChildSpec),
+		ok = supervisor:check_childspecs([ChildSpec1], AutoShutdown)
 	end,
 	[
-	    CS0#{restart => Restart,
-		 shutdown => Shutdown,
-		 type => Type,
-		 modules => Modules,
-		 significant => Significant,
-		 dummy => Dummy}
+	    {AutoShutdown,
+	     CS0#{restart => Restart,
+		  shutdown => Shutdown,
+		  type => Type,
+		  modules => Modules,
+		  significant => Significant,
+		  dummy => Dummy}}
 	    ||
+		AutoShutdown <- [undefined, never, any_significant, all_significant],
 		Restart <- [undefined, permanent, transient, temporary],
 		Shutdown <- [undefined, 1000, infinity, brutal_kill],
 		Type <- [undefined, supervisor, worker],
-- 
2.26.2

openSUSE Build Service is sponsored by