File 1103-Add-support-for-SIGCONT-system-signal.patch of Package erlang

From 5cf21abc9b93687183d92922d4d6b510902dd5db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?=
 <jean-sebastien.pedron@dumbbell.fr>
Date: Mon, 14 Oct 2024 18:57:13 +0200
Subject: [PATCH] Add support for `SIGCONT` system signal

This signal is used after `SIGSTOP` or `SIGTSTP` to resume a system
process. Shell job control relies on these signals.
---
 erts/emulator/beam/atom.names          |  1 +
 erts/emulator/sys/unix/sys.c           |  4 +++-
 erts/emulator/test/os_signal_SUITE.erl | 32 +++++++++++++++++++++++++-
 lib/kernel/doc/kernel_app.md           |  2 ++
 lib/kernel/src/os.erl                  |  3 ++-
 5 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names
index ff5f2c1303..b017300f4a 100644
--- a/erts/emulator/beam/atom.names
+++ b/erts/emulator/beam/atom.names
@@ -673,6 +673,7 @@ atom sigstop
 atom sigint
 atom sigsegv
 atom sigtstp
+atom sigcont
 atom sigquit
 atom sigwinch
 atom siginfo
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index da034cb373..cd9800d19c 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -682,7 +682,7 @@ static RETSIGTYPE suspend_signal(int signum)
   SIGUSR1    Term     User-defined signal 1
   SIGUSR2    Term     User-defined signal 2
  !SIGCHLD    Ign      Child stopped or terminated
- !SIGCONT    Cont     Continue if stopped
+  SIGCONT    Cont     Continue if stopped
   SIGSTOP    Stop     Stop process
   SIGTSTP    Stop     Stop typed at terminal
  !SIGTTIN    Stop     Terminal input for background process
@@ -709,6 +709,7 @@ signalterm_to_signum(Eterm signal)
     case am_sigchld: return SIGCHLD;
     case am_sigstop: return SIGSTOP;
     case am_sigtstp: return SIGTSTP;
+    case am_sigcont: return SIGCONT;
     case am_sigwinch: return SIGWINCH;
 #ifdef SIGINFO
     case am_siginfo: return SIGINFO;
@@ -734,6 +735,7 @@ signum_to_signalterm(int signum)
     case SIGCHLD: return am_sigchld;
     case SIGSTOP: return am_sigstop;
     case SIGTSTP: return am_sigtstp;   /* ^z */
+    case SIGCONT: return am_sigcont;
     case SIGWINCH: return am_sigwinch;
 #ifdef SIGINFO
     case SIGINFO: return am_siginfo;  /* ^t */
diff --git a/erts/emulator/test/os_signal_SUITE.erl b/erts/emulator/test/os_signal_SUITE.erl
index 4887baf732..072e10b816 100644
--- a/erts/emulator/test/os_signal_SUITE.erl
+++ b/erts/emulator/test/os_signal_SUITE.erl
@@ -42,6 +42,7 @@
          t_sigalrm/1,
          t_sigchld/1,
          t_sigchld_fork/1,
+         t_sigcont/1,
          t_sigwinch/1,
          t_siginfo/1]).
 
@@ -95,7 +96,7 @@ set_unset(_Config) ->
                sigalrm, sigterm,
                sigusr1, sigusr2,
                sigchld,
-               sigstop, sigtstp],
+               sigstop, sigtstp, sigcont],
     F1 = fun(Sig) -> ok = os:set_signal(Sig,handle) end,
     F2 = fun(Sig) -> ok = os:set_signal(Sig,default) end,
     F3 = fun(Sig) -> ok = os:set_signal(Sig,ignore) end,
@@ -302,6 +303,35 @@ sigchld_fork() ->
     os:set_signal(sigchld, ignore),
     ok.
 
+t_sigcont(_Config) ->
+    Pid1 = setup_service(),
+    OsPid = os:getpid(),
+    os:set_signal(sigcont, handle),
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    Msgs1 = fetch_msgs(Pid1),
+    io:format("Msgs1: ~p~n", [Msgs1]),
+    [{notify,sigcont},
+     {notify,sigcont},
+     {notify,sigcont}] = Msgs1,
+    %% no proc
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    %% ignore
+    Pid2 = setup_service(),
+    os:set_signal(sigcont, ignore),
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    ok = kill("CONT", OsPid),
+    Msgs2 = fetch_msgs(Pid2),
+    io:format("Msgs2: ~p~n", [Msgs2]),
+    [] = Msgs2,
+    %% reset to ignore (it's the default)
+    os:set_signal(sigcont, ignore),
+    ok.
+
 t_sigwinch(_Config) ->
     Pid1 = setup_service(),
     OsPid = os:getpid(),
diff --git a/lib/kernel/doc/src/kernel_app.xml b/lib/kernel/doc/src/kernel_app.xml
index 186ce889e5..f1b52ef54a 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>sigcont</c></tag>
+                  <item><p>Continue after stop</p></item>
                   <tag><c>sigwinch</c></tag>
                   <item><p>Window size change</p></item>
                   <tag><c>siginfo</c></tag>
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index bab043370d..26a03952e7 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -302,7 +302,8 @@ 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' | 'sigwinch' | 'siginfo',
+                'sigstop' | 'sigtstp' | 'sigcont' | 'sigwinch' |
+                'siginfo',
       Option :: 'default' | 'handle' | 'ignore'.
 
 set_signal(_Signal, _Option) ->
-- 
2.43.0

openSUSE Build Service is sponsored by