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