File 7496-Remove-intermediate-starter-process.patch of Package erlang
From e5a56843c80845cb835a797b9802109ba0bdd77b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muska=C5=82a?= <micmus@fb.com>
Date: Tue, 23 Jan 2024 16:06:26 +0000
Subject: [PATCH 6/6] Remove intermediate starter process
---
lib/kernel/src/application_controller.erl | 18 ++----------------
lib/kernel/src/application_master.erl | 15 ++++++++-------
2 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/lib/kernel/src/application_controller.erl b/lib/kernel/src/application_controller.erl
index 2398f1dfc5..0363b7597a 100644
--- a/lib/kernel/src/application_controller.erl
+++ b/lib/kernel/src/application_controller.erl
@@ -36,7 +36,7 @@
%% Internal exports
-export([handle_call/3, handle_cast/2, handle_info/2, terminate/2,
- code_change/3, init_starter/2, get_loaded/1]).
+ code_change/3, get_loaded/1]).
%% logger callback
-export([format_log/1, format_log/2]).
@@ -1391,27 +1391,13 @@ spawn_starter(Appl, S, Type) ->
Reply = {info, {not_running, NotRunning}},
gen_server:cast(?AC, {application_started, Appl#appl.name, Reply});
false ->
- spawn_link(?MODULE, init_starter, [Appl#appl.appl_data, Type])
+ application_master:start_link(Appl#appl.appl_data, Type)
end.
-init_starter(ApplData, Type) ->
- process_flag(trap_exit, true),
- AppName = ApplData#appl_data.name,
- gen_server:cast(?AC, {application_started, AppName,
- catch start_appl(ApplData, Type)}).
-
reply(undefined, _Reply) ->
ok;
reply(From, Reply) -> gen_server:reply(From, Reply).
-start_appl(ApplData, Type) ->
- case application_master:start_link(ApplData, Type) of
- {ok, _Pid} = Ok ->
- Ok;
- {error, _Reason} = Error ->
- throw(Error)
- end.
-
find_missing_dependency(Appl, Applications) ->
Pred = fun(AppName) -> not lists:keymember(AppName, 1, Applications) end,
lists:search(Pred, Appl#appl.apps -- Appl#appl.opt_apps).
diff --git a/lib/kernel/src/application_master.erl b/lib/kernel/src/application_master.erl
index fa8fed6d28..4daa9d453c 100644
--- a/lib/kernel/src/application_master.erl
+++ b/lib/kernel/src/application_master.erl
@@ -24,7 +24,7 @@
-export([get_child/1]).
%% Internal exports
--export([init/4, start_it/4]).
+-export([init/3, start_it/4]).
-include("application_master.hrl").
@@ -39,9 +39,8 @@
%% Returns: {ok, Pid} | {error, Reason} (Pid is unregistered)
%%-----------------------------------------------------------------
start_link(ApplData, Type) ->
- Parent = whereis(application_controller),
proc_lib:start_link(application_master, init,
- [Parent, self(), ApplData, Type]).
+ [self(), ApplData, Type]).
start_type() ->
group_leader() ! {start_type, self()},
@@ -114,8 +113,9 @@ call(AppMaster, Req) ->
%%%-----------------------------------------------------------------
%%% Internal functions
%%%-----------------------------------------------------------------
-init(Parent, Starter, ApplData, Type) ->
- link(Parent),
+init(Parent, ApplData, Type) ->
+ %% Unblock the parent process as soon as possible
+ proc_lib:init_ack(Parent, {ok, self()}),
process_flag(trap_exit, true),
OldGleader =
case group_leader() == whereis(init) of
@@ -135,12 +135,13 @@ init(Parent, Starter, ApplData, Type) ->
case start_it(State, Type) of
{ok, Pid} -> % apply(M,F,A) returned ok
ok = set_timer(ApplData#appl_data.maxT),
- unlink(Starter),
- proc_lib:init_ack(Starter, {ok,self()}),
+ gen_server:cast(Parent, {application_started, Name, {ok, self()}}),
main_loop(Parent, State#state{child = Pid});
{error, Reason} -> % apply(M,F,A) returned error
+ gen_server:cast(Parent, {application_started, Name, {error, Reason}}),
exit(Reason);
Else -> % apply(M,F,A) returned erroneous
+ gen_server:cast(Parent, {application_started, Name, {error, Else}}),
exit(Else)
end.
--
2.35.3