Skip to content

Commit

Permalink
kernel: Guarantee that signal server will always run
Browse files Browse the repository at this point in the history
  • Loading branch information
garazdawi committed Oct 15, 2024
1 parent 4c5a367 commit 2a45d46
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 17 deletions.
7 changes: 1 addition & 6 deletions lib/kernel/src/erl_signal_handler.erl
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,7 @@

start() ->
%% add signal handler
case whereis(erl_signal_server) of
%% in case of minimal mode
undefined -> ok;
_ ->
gen_event:add_handler(erl_signal_server, erl_signal_handler, [])
end.
gen_event:add_handler(erl_signal_server, erl_signal_handler, []).

init(_Args) ->
{ok, #state{}}.
Expand Down
17 changes: 9 additions & 8 deletions lib/kernel/src/kernel.erl
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,14 @@ init([]) ->
type => worker,
modules => [?MODULE]},

%% Must be started before user
SigSrv = #{id => erl_signal_server,
start => {gen_event, start_link, [{local, erl_signal_server}]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => dynamic},

User = #{id => user,
start => {user_sup, start, []},
restart => temporary,
Expand Down Expand Up @@ -187,7 +195,7 @@ init([]) ->
{ok, {SupFlags,
[Code, StdError | EarlyFile] ++
[OnLoad | LateFile] ++
Peer ++
[SigSrv | Peer] ++
[User, LoggerSup, Config, RefC, SafeSup]}};
_ ->
DistChildren =
Expand All @@ -203,13 +211,6 @@ init([]) ->
type => worker,
modules => [inet_db]},

SigSrv = #{id => erl_signal_server,
start => {gen_event, start_link, [{local, erl_signal_server}]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => dynamic},

Timer = start_timer(),
CompileServer = start_compile_server(),

Expand Down
5 changes: 2 additions & 3 deletions lib/kernel/src/prim_tty.erl
Original file line number Diff line number Diff line change
Expand Up @@ -327,9 +327,8 @@ init_term(State = #state{ tty = TTY, options = Options }) ->
%%
%% After SIGCONT and SIGWINCH support was added, this module uses a
%% gen_event handler in `prim_tty_sighandler'.
case {ReaderState#state.reader, erlang:whereis(erl_signal_server)} of
{{_ReaderPid, ReaderRef}, EssPid}
when is_reference(ReaderRef) andalso is_pid(EssPid) ->
case ReaderState#state.reader of
{_ReaderPid, ReaderRef} when is_reference(ReaderRef) ->
_ = gen_event:delete_handler(
erl_signal_server, prim_tty_sighandler,
undefined),
Expand Down

0 comments on commit 2a45d46

Please sign in to comment.