File 1091-Add-support-for-SIGWINCH-system-signal.patch of Package erlang
From 0fcd57449597688c0eff2b07065be4e7612daca5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?=
<jean-sebastien.pedron@dumbbell.fr>
Date: Tue, 1 Oct 2024 16:48:09 +0200
Subject: [PATCH 1/2] Add support for `SIGWINCH` system signal
This signal is emitted when the terminal window is resized to allow an
application to redraw its content.
---
erts/emulator/beam/atom.names | 1 +
erts/emulator/sys/unix/sys.c | 3 +++
erts/emulator/test/os_signal_SUITE.erl | 33 +++++++++++++++++++++++++-
lib/kernel/doc/kernel_app.md | 2 ++
lib/kernel/src/os.erl | 2 +-
5 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names
index 758c84d1c1..5686284187 100644
--- a/erts/emulator/beam/atom.names
+++ b/erts/emulator/beam/atom.names
@@ -674,6 +674,7 @@ atom sigint
atom sigsegv
atom sigtstp
atom sigquit
+atom sigwinch
atom silent
atom size
atom spawn_executable
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index 53cd17e44c..68479fa177 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -687,6 +687,7 @@ static RETSIGTYPE suspend_signal(int signum)
SIGTSTP Stop Stop typed at terminal
!SIGTTIN Stop Terminal input for background process
!SIGTTOU Stop Terminal output for background process
+ SIGWINCH Ign Window size change
*/
@@ -707,6 +708,7 @@ signalterm_to_signum(Eterm signal)
case am_sigchld: return SIGCHLD;
case am_sigstop: return SIGSTOP;
case am_sigtstp: return SIGTSTP;
+ case am_sigwinch: return SIGWINCH;
default: return 0;
}
}
@@ -728,6 +730,7 @@ signum_to_signalterm(int signum)
case SIGCHLD: return am_sigchld;
case SIGSTOP: return am_sigstop;
case SIGTSTP: return am_sigtstp; /* ^z */
+ case SIGWINCH: return am_sigwinch;
default: return am_error;
}
}
diff --git a/erts/emulator/test/os_signal_SUITE.erl b/erts/emulator/test/os_signal_SUITE.erl
index 21e3bebb6b..affcd95ef4 100644
--- a/erts/emulator/test/os_signal_SUITE.erl
+++ b/erts/emulator/test/os_signal_SUITE.erl
@@ -41,7 +41,8 @@
t_sigterm/1,
t_sigalrm/1,
t_sigchld/1,
- t_sigchld_fork/1]).
+ t_sigchld_fork/1,
+ t_sigwinch/1]).
-define(signal_server, erl_signal_server).
@@ -59,6 +60,7 @@ all() ->
t_sigalrm,
t_sigchld,
t_sigchld_fork,
+ t_sigwinch,
set_unset]
end.
@@ -298,6 +300,35 @@ sigchld_fork() ->
os:set_signal(sigchld, ignore),
ok.
+t_sigwinch(_Config) ->
+ Pid1 = setup_service(),
+ OsPid = os:getpid(),
+ os:set_signal(sigwinch, handle),
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ Msgs1 = fetch_msgs(Pid1),
+ io:format("Msgs1: ~p~n", [Msgs1]),
+ [{notify,sigwinch},
+ {notify,sigwinch},
+ {notify,sigwinch}] = Msgs1,
+ %% no proc
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ %% ignore
+ Pid2 = setup_service(),
+ os:set_signal(sigwinch, ignore),
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ ok = kill("WINCH", OsPid),
+ Msgs2 = fetch_msgs(Pid2),
+ io:format("Msgs2: ~p~n", [Msgs2]),
+ [] = Msgs2,
+ %% reset to ignore (it's the default)
+ os:set_signal(sigwinch, ignore),
+ ok.
+
%% nif stubs
diff --git a/lib/kernel/doc/src/kernel_app.xml b/lib/kernel/doc/src/kernel_app.xml
index 4f634399fc..b19a35d126 100644
--- a/lib/kernel/doc/src/kernel_app.xml
+++ b/lib/kernel/doc/src/kernel_app.xml
@@ -108,6 +108,8 @@
<item><p>Stop process</p></item>
<tag><c>sigtstp</c></tag>
<item><p>Stop typed at terminal</p></item>
+ <tag><c>sigwinch</c></tag>
+ <item><p>Window size change</p></item>
</taglist>
<p>Setting OS signals are described in <seemfa marker="os#set_signal/2"><c>os:set_signal/2</c></seemfa>.</p>
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index adb31bd678..e730c085ad 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -302,7 +302,7 @@ Each signal my be set to one of the following options:
-spec set_signal(Signal, Option) -> 'ok' when
Signal :: 'sighup' | 'sigquit' | 'sigabrt' | 'sigalrm' |
'sigterm' | 'sigusr1' | 'sigusr2' | 'sigchld' |
- 'sigstop' | 'sigtstp',
+ 'sigstop' | 'sigtstp' | 'sigwinch',
Option :: 'default' | 'handle' | 'ignore'.
set_signal(_Signal, _Option) ->
--
2.43.0