File 2934-kernel-Make-sure-user-is-registered-when-start-retur.patch of Package erlang
From c259e3934792ba795f98556181e74cbb7b961785 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Wed, 11 May 2022 16:07:50 +0200
Subject: [PATCH 14/34] kernel: Make sure `user` is registered when start
returns
In order to avoid spinning in `user_sup` we start user
during the synchronous phase of `user_drv` startup.
See #4895 for more details
---
lib/kernel/src/user_drv.erl | 11 +++--------
lib/kernel/src/user_sup.erl | 4 ++--
2 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl
index af72dc51ea..0c316a100e 100644
--- a/lib/kernel/src/user_drv.erl
+++ b/lib/kernel/src/user_drv.erl
@@ -104,10 +104,7 @@ start(Args) when is_map(Args) ->
case gen_statem:start({local, ?MODULE}, ?MODULE, Args, []) of
{ok, Pid} -> Pid;
{error, _Reason} ->
- spawn(fun() ->
- process_flag(trap_exit, true),
- user:start()
- end)
+ user:start()
end.
callback_mode() -> state_functions.
@@ -118,13 +115,11 @@ init(Args) ->
{'EXIT', _Reason} ->
{stop, normal};
Port ->
- {ok, init, {Args, #state{ } },
+ {ok, init, {Args, #state{ user = start_user() } },
{next_event, internal, Port}}
end.
-init(internal, Port, {Args, State}) ->
-
- User = start_user(),
+init(internal, Port, {Args, State = #state{ user = User }}) ->
%% Cleanup ancestors so that observer looks nice
put('$ancestors',[User|get('$ancestors')]),
diff --git a/lib/kernel/src/user_sup.erl b/lib/kernel/src/user_sup.erl
index 6206a8d0ab..038d359564 100644
--- a/lib/kernel/src/user_sup.erl
+++ b/lib/kernel/src/user_sup.erl
@@ -45,7 +45,7 @@ init(Flags) ->
nouser ->
ignore;
{master, Master} ->
- Pid = start_slave(Master),
+ Pid = start_relay(Master),
{ok, Pid, Pid};
{M, F, A} ->
case start_user(M, F, A) of
@@ -56,7 +56,7 @@ init(Flags) ->
end
end.
-start_slave(Master) ->
+start_relay(Master) ->
case rpc:call(Master, erlang, whereis, [user]) of
User when is_pid(User) ->
spawn(?MODULE, relay, [User]);
--
2.35.3