Message ID | 87pnb6qpw5.fsf@oldenburg2.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | [v2] signal: Deprecate additional legacy signal handling functions | expand |
On 14/05/2020 16:26, Florian Weimer via Libc-alpha wrote: > This needs a few test adjustments: In some cases, sigignore was > used for convenience (replaced with xsignal with SIG_IGN). Tests > for the deprecated functions need to disable > -Wdeprecated-declarations, and for the sigmask deprecation, > -Wno-error. > LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > Changes since v1: > Use <libc-diag.h> > Deprecate siginterrupt, sigmask > Mention alternative functions in the manual > > NEWS | 5 +++++ > manual/signal.texi | 6 ++++++ > nptl/Makefile | 7 +++++++ > nptl/tst-cancel4.c | 7 +++++++ > nptl/tst-exec1.c | 7 ++----- > nptl/tst-exec2.c | 7 ++----- > nptl/tst-exec3.c | 7 ++----- > nptl/tst-exec4.c | 8 ++------ > nptl/tst-exec5.c | 6 +----- > signal/signal.h | 23 ++++++++++++++++------- > signal/tst-sigset2.c | 4 ++++ > signal/tst-sigsimple.c | 3 +++ > 12 files changed, 57 insertions(+), 33 deletions(-) > > diff --git a/NEWS b/NEWS > index 141078c319..fb46af2dd3 100644 > --- a/NEWS > +++ b/NEWS > @@ -35,6 +35,11 @@ Deprecated and removed features, and other changes affecting compatibility: > Its implementation always returned with a failure, and the function > was not declared in any header file. > > +* The legacy signal handling functions siginterrupt, sigpause, sighold, > + sigrelse, sigignore and sigset, and the sigmask macro have been > + deprecated. Applications should use the sigsuspend, sigprocmask and > + sigaction functions instead. > + > Changes to build and runtime requirements: > > * powerpc64le requires GCC 7.4 or newer. This is required for supporting Ok. > diff --git a/manual/signal.texi b/manual/signal.texi > index 33e6646975..911b422a18 100644 > --- a/manual/signal.texi > +++ b/manual/signal.texi > @@ -3250,6 +3250,9 @@ are interrupted by handling signal @var{signum}. If @var{failflag} is > false, signal @var{signum} restarts primitives. If @var{failflag} is > true, handling @var{signum} causes these primitives to fail with error > code @code{EINTR}. @xref{Interrupted Primitives}. > + > +This function has been replaced by the @code{SA_RESTART} flag of the > +@code{sigaction} function. @xref{Advanced Signal Handling}. > @end deftypefun > > @deftypefn Macro int sigmask (int @var{signum}) Ok. > @@ -3267,6 +3270,9 @@ together to specify more than one signal. For example, > > @noindent > specifies a mask that includes all the job-control stop signals. > + > +This macro has been replaced by the @code{sigset_t} type and the > +associated signal set manipulation functions. @xref{Signal Sets}. > @end deftypefn > > @deftypefun int sigblock (int @var{mask}) Ok. > diff --git a/nptl/Makefile b/nptl/Makefile > index ef9a6eb561..105ae50301 100644 > --- a/nptl/Makefile > +++ b/nptl/Makefile > @@ -501,6 +501,13 @@ endif > # function frequently to get a thread-specific handle. > CFLAGS-pthread_self.os += -fomit-frame-pointer > > +# The sigmask macro is deprecated and triggers are compiler warning > +# which cannot be suppressed (as of GCC 9). > +CFLAGS-tst-cancel4.c += -Wno-error > +CFLAGS-tst-cancel5.c += -Wno-error > +CFLAGS-tst-cancelx4.c += -Wno-error > +CFLAGS-tst-cancelx5.c += -Wno-error > + Ok. > # Run the cancellation and cleanup tests also for the modern, exception-based > # implementation. For this we have to pass the -fexceptions parameter. > CFLAGS-tst-cancelx2.c += -fexceptions > diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c > index 652668537a..be7a48e253 100644 > --- a/nptl/tst-cancel4.c > +++ b/nptl/tst-cancel4.c > @@ -39,6 +39,7 @@ > #include <sys/wait.h> > #include <sys/stat.h> > #include <sys/uio.h> > +#include <libc-diag.h> > > > /* Since STREAMS are not supported in the standard Linux kernel and > @@ -527,7 +528,13 @@ tf_sigpause (void *arg) > > pthread_cleanup_push (cl, NULL); > > + /* This tests the deprecated sigpause and sigmask functions. The > + file is compiled with -Wno-errno so that the sigmask deprecation > + warning is not fatal. */ > + DIAG_PUSH_NEEDS_COMMENT; > + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); > sigpause (sigmask (SIGINT)); > + DIAG_POP_NEEDS_COMMENT; > > pthread_cleanup_pop (0); > Ok. > diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c > index e1a5baa41f..892107d4c7 100644 > --- a/nptl/tst-exec1.c > +++ b/nptl/tst-exec1.c > @@ -27,6 +27,7 @@ > #include <stdlib.h> > #include <unistd.h> > #include <sys/wait.h> > +#include <support/xsignal.h> > > > static void * > @@ -56,11 +57,7 @@ do_test (void) > } > > /* Not interested in knowing when the pipe is closed. */ > - if (sigignore (SIGPIPE) != 0) > - { > - puts ("sigignore failed"); > - exit (1); > - } > + xsignal (SIGPIPE, SIG_IGN); > > posix_spawn_file_actions_t a; > if (posix_spawn_file_actions_init (&a) != 0) Ok. > diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c > index 3d3fb430bf..f57903da1e 100644 > --- a/nptl/tst-exec2.c > +++ b/nptl/tst-exec2.c > @@ -27,6 +27,7 @@ > #include <stdlib.h> > #include <unistd.h> > #include <sys/wait.h> > +#include <support/xsignal.h> > > > static void * > @@ -56,11 +57,7 @@ do_test (void) > } > > /* Not interested in knowing when the pipe is closed. */ > - if (sigignore (SIGPIPE) != 0) > - { > - puts ("sigignore failed"); > - exit (1); > - } > + xsignal (SIGPIPE, SIG_IGN); > > pid_t pid = fork (); > if (pid == -1) Ok. > diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c > index 8a018e916e..b849d3aef7 100644 > --- a/nptl/tst-exec3.c > +++ b/nptl/tst-exec3.c > @@ -27,6 +27,7 @@ > #include <stdlib.h> > #include <unistd.h> > #include <sys/wait.h> > +#include <support/xsignal.h> > > > static void * > @@ -50,11 +51,7 @@ do_test (void) > } > > /* Not interested in knowing when the pipe is closed. */ > - if (sigignore (SIGPIPE) != 0) > - { > - puts ("sigignore failed"); > - exit (1); > - } > + xsignal (SIGPIPE, SIG_IGN); > > pid_t pid = fork (); > if (pid == -1) Ok. > diff --git a/nptl/tst-exec4.c b/nptl/tst-exec4.c > index cf5998219b..2f32389f41 100644 > --- a/nptl/tst-exec4.c > +++ b/nptl/tst-exec4.c > @@ -22,17 +22,13 @@ > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > - > +#include <support/xsignal.h> > > static void * > tf (void *arg) > { > /* Ignore SIGUSR1 and block SIGUSR2. */ > - if (sigignore (SIGUSR1) != 0) > - { > - puts ("sigignore failed"); > - exit (1); > - } > + xsignal (SIGUSR1, SIG_IGN); > > sigset_t ss; > sigemptyset (&ss); Ok. > diff --git a/nptl/tst-exec5.c b/nptl/tst-exec5.c > index 02628931c8..c77f856263 100644 > --- a/nptl/tst-exec5.c > +++ b/nptl/tst-exec5.c > @@ -86,11 +86,7 @@ do_test (void) > } > > /* Not interested in knowing when the pipe is closed. */ > - if (sigignore (SIGPIPE) != 0) > - { > - puts ("error: sigignore failed"); > - exit (1); > - } > + xsignal (SIGPIPE, SIG_IGN); > > /* To synchronize with the thread. */ > if (pthread_barrier_init (&b, NULL, 2) != 0) Ok. > diff --git a/signal/signal.h b/signal/signal.h > index 40825e95ec..2c57f90e20 100644 > --- a/signal/signal.h > +++ b/signal/signal.h > @@ -148,7 +148,8 @@ extern void psiginfo (const siginfo_t *__pinfo, const char *__s); > > #ifdef __USE_XOPEN_EXTENDED > # ifdef __GNUC__ > -extern int sigpause (int __sig) __asm__ ("__xpg_sigpause"); > +extern int sigpause (int __sig) __asm__ ("__xpg_sigpause") > + __attribute_deprecated_msg__ ("Use the sigsuspend function instead"); > # else > extern int __sigpause (int __sig_or_mask, int __is_sig); > /* Remove a signal from the signal mask and suspend the process. */ Ok. > @@ -164,7 +165,9 @@ extern int __sigpause (int __sig_or_mask, int __is_sig); > simply do not work in many situations. Use `sigprocmask' instead. */ > > /* Compute mask for signal SIG. */ > -# define sigmask(sig) ((int)(1u << ((sig) - 1))) > +# define sigmask(sig) \ > + __glibc_macro_warning ("sigmask is deprecated") \ > + ((int)(1u << ((sig) - 1))) > > /* Block signals in MASK, returning the old mask. */ Ok. > extern int sigblock (int __mask) __THROW __attribute_deprecated__; > @@ -311,7 +314,8 @@ extern int sigreturn (struct sigcontext *__scp) __THROW; > /* If INTERRUPT is nonzero, make signal SIG interrupt system calls > (causing them to fail with EINTR); if INTERRUPT is zero, make system > calls be restarted after signal SIG. */ > -extern int siginterrupt (int __sig, int __interrupt) __THROW; > +extern int siginterrupt (int __sig, int __interrupt) __THROW > + __attribute_deprecated_msg__ ("Use sigaction with SA_RESTART instead"); > > # include <bits/sigstack.h> > # include <bits/ss_flags.h> Ok. > @@ -340,16 +344,21 @@ extern int sigstack (struct sigstack *__ss, struct sigstack *__oss) > /* Simplified interface for signal management. */ > > /* Add SIG to the calling process' signal mask. */ > -extern int sighold (int __sig) __THROW; > +extern int sighold (int __sig) __THROW > + __attribute_deprecated_msg__ ("Use the sigprocmask function instead"); > > /* Remove SIG from the calling process' signal mask. */ > -extern int sigrelse (int __sig) __THROW; > +extern int sigrelse (int __sig) __THROW > + __attribute_deprecated_msg__ ("Use the sigprocmask function instead"); > > /* Set the disposition of SIG to SIG_IGN. */ > -extern int sigignore (int __sig) __THROW; > +extern int sigignore (int __sig) __THROW > + __attribute_deprecated_msg__ ("Use the signal function instead"); > > /* Set the disposition of SIG. */ > -extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW; > +extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW > + __attribute_deprecated_msg__ > + ("Use the signal and sigprocmask functions instead"); > #endif > > #if defined __USE_POSIX199506 || defined __USE_UNIX98 Ok. > diff --git a/signal/tst-sigset2.c b/signal/tst-sigset2.c > index f653323321..4eef653f95 100644 > --- a/signal/tst-sigset2.c > +++ b/signal/tst-sigset2.c > @@ -9,6 +9,10 @@ > #include <unistd.h> > #include <sys/types.h> > #include <sys/wait.h> > +#include <libc-diag.h> > + > +/* The sigset function is deprecated. */ > +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); > > #define TEST_SIG SIGINT > Ok. > diff --git a/signal/tst-sigsimple.c b/signal/tst-sigsimple.c > index d0e6b2f340..56202348bc 100644 > --- a/signal/tst-sigsimple.c > +++ b/signal/tst-sigsimple.c > @@ -20,7 +20,10 @@ > #include <signal.h> > #include <stdio.h> > #include <string.h> > +#include <libc-diag.h> > > +/* The sighold and sigrelse functions are deprecated. */ > +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); > > static int > do_test (void) > Ok.
diff --git a/NEWS b/NEWS index 141078c319..fb46af2dd3 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,11 @@ Deprecated and removed features, and other changes affecting compatibility: Its implementation always returned with a failure, and the function was not declared in any header file. +* The legacy signal handling functions siginterrupt, sigpause, sighold, + sigrelse, sigignore and sigset, and the sigmask macro have been + deprecated. Applications should use the sigsuspend, sigprocmask and + sigaction functions instead. + Changes to build and runtime requirements: * powerpc64le requires GCC 7.4 or newer. This is required for supporting diff --git a/manual/signal.texi b/manual/signal.texi index 33e6646975..911b422a18 100644 --- a/manual/signal.texi +++ b/manual/signal.texi @@ -3250,6 +3250,9 @@ are interrupted by handling signal @var{signum}. If @var{failflag} is false, signal @var{signum} restarts primitives. If @var{failflag} is true, handling @var{signum} causes these primitives to fail with error code @code{EINTR}. @xref{Interrupted Primitives}. + +This function has been replaced by the @code{SA_RESTART} flag of the +@code{sigaction} function. @xref{Advanced Signal Handling}. @end deftypefun @deftypefn Macro int sigmask (int @var{signum}) @@ -3267,6 +3270,9 @@ together to specify more than one signal. For example, @noindent specifies a mask that includes all the job-control stop signals. + +This macro has been replaced by the @code{sigset_t} type and the +associated signal set manipulation functions. @xref{Signal Sets}. @end deftypefn @deftypefun int sigblock (int @var{mask}) diff --git a/nptl/Makefile b/nptl/Makefile index ef9a6eb561..105ae50301 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -501,6 +501,13 @@ endif # function frequently to get a thread-specific handle. CFLAGS-pthread_self.os += -fomit-frame-pointer +# The sigmask macro is deprecated and triggers are compiler warning +# which cannot be suppressed (as of GCC 9). +CFLAGS-tst-cancel4.c += -Wno-error +CFLAGS-tst-cancel5.c += -Wno-error +CFLAGS-tst-cancelx4.c += -Wno-error +CFLAGS-tst-cancelx5.c += -Wno-error + # Run the cancellation and cleanup tests also for the modern, exception-based # implementation. For this we have to pass the -fexceptions parameter. CFLAGS-tst-cancelx2.c += -fexceptions diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 652668537a..be7a48e253 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -39,6 +39,7 @@ #include <sys/wait.h> #include <sys/stat.h> #include <sys/uio.h> +#include <libc-diag.h> /* Since STREAMS are not supported in the standard Linux kernel and @@ -527,7 +528,13 @@ tf_sigpause (void *arg) pthread_cleanup_push (cl, NULL); + /* This tests the deprecated sigpause and sigmask functions. The + file is compiled with -Wno-errno so that the sigmask deprecation + warning is not fatal. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); sigpause (sigmask (SIGINT)); + DIAG_POP_NEEDS_COMMENT; pthread_cleanup_pop (0); diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c index e1a5baa41f..892107d4c7 100644 --- a/nptl/tst-exec1.c +++ b/nptl/tst-exec1.c @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> +#include <support/xsignal.h> static void * @@ -56,11 +57,7 @@ do_test (void) } /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } + xsignal (SIGPIPE, SIG_IGN); posix_spawn_file_actions_t a; if (posix_spawn_file_actions_init (&a) != 0) diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c index 3d3fb430bf..f57903da1e 100644 --- a/nptl/tst-exec2.c +++ b/nptl/tst-exec2.c @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> +#include <support/xsignal.h> static void * @@ -56,11 +57,7 @@ do_test (void) } /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } + xsignal (SIGPIPE, SIG_IGN); pid_t pid = fork (); if (pid == -1) diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c index 8a018e916e..b849d3aef7 100644 --- a/nptl/tst-exec3.c +++ b/nptl/tst-exec3.c @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> +#include <support/xsignal.h> static void * @@ -50,11 +51,7 @@ do_test (void) } /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } + xsignal (SIGPIPE, SIG_IGN); pid_t pid = fork (); if (pid == -1) diff --git a/nptl/tst-exec4.c b/nptl/tst-exec4.c index cf5998219b..2f32389f41 100644 --- a/nptl/tst-exec4.c +++ b/nptl/tst-exec4.c @@ -22,17 +22,13 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> - +#include <support/xsignal.h> static void * tf (void *arg) { /* Ignore SIGUSR1 and block SIGUSR2. */ - if (sigignore (SIGUSR1) != 0) - { - puts ("sigignore failed"); - exit (1); - } + xsignal (SIGUSR1, SIG_IGN); sigset_t ss; sigemptyset (&ss); diff --git a/nptl/tst-exec5.c b/nptl/tst-exec5.c index 02628931c8..c77f856263 100644 --- a/nptl/tst-exec5.c +++ b/nptl/tst-exec5.c @@ -86,11 +86,7 @@ do_test (void) } /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("error: sigignore failed"); - exit (1); - } + xsignal (SIGPIPE, SIG_IGN); /* To synchronize with the thread. */ if (pthread_barrier_init (&b, NULL, 2) != 0) diff --git a/signal/signal.h b/signal/signal.h index 40825e95ec..2c57f90e20 100644 --- a/signal/signal.h +++ b/signal/signal.h @@ -148,7 +148,8 @@ extern void psiginfo (const siginfo_t *__pinfo, const char *__s); #ifdef __USE_XOPEN_EXTENDED # ifdef __GNUC__ -extern int sigpause (int __sig) __asm__ ("__xpg_sigpause"); +extern int sigpause (int __sig) __asm__ ("__xpg_sigpause") + __attribute_deprecated_msg__ ("Use the sigsuspend function instead"); # else extern int __sigpause (int __sig_or_mask, int __is_sig); /* Remove a signal from the signal mask and suspend the process. */ @@ -164,7 +165,9 @@ extern int __sigpause (int __sig_or_mask, int __is_sig); simply do not work in many situations. Use `sigprocmask' instead. */ /* Compute mask for signal SIG. */ -# define sigmask(sig) ((int)(1u << ((sig) - 1))) +# define sigmask(sig) \ + __glibc_macro_warning ("sigmask is deprecated") \ + ((int)(1u << ((sig) - 1))) /* Block signals in MASK, returning the old mask. */ extern int sigblock (int __mask) __THROW __attribute_deprecated__; @@ -311,7 +314,8 @@ extern int sigreturn (struct sigcontext *__scp) __THROW; /* If INTERRUPT is nonzero, make signal SIG interrupt system calls (causing them to fail with EINTR); if INTERRUPT is zero, make system calls be restarted after signal SIG. */ -extern int siginterrupt (int __sig, int __interrupt) __THROW; +extern int siginterrupt (int __sig, int __interrupt) __THROW + __attribute_deprecated_msg__ ("Use sigaction with SA_RESTART instead"); # include <bits/sigstack.h> # include <bits/ss_flags.h> @@ -340,16 +344,21 @@ extern int sigstack (struct sigstack *__ss, struct sigstack *__oss) /* Simplified interface for signal management. */ /* Add SIG to the calling process' signal mask. */ -extern int sighold (int __sig) __THROW; +extern int sighold (int __sig) __THROW + __attribute_deprecated_msg__ ("Use the sigprocmask function instead"); /* Remove SIG from the calling process' signal mask. */ -extern int sigrelse (int __sig) __THROW; +extern int sigrelse (int __sig) __THROW + __attribute_deprecated_msg__ ("Use the sigprocmask function instead"); /* Set the disposition of SIG to SIG_IGN. */ -extern int sigignore (int __sig) __THROW; +extern int sigignore (int __sig) __THROW + __attribute_deprecated_msg__ ("Use the signal function instead"); /* Set the disposition of SIG. */ -extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW; +extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW + __attribute_deprecated_msg__ + ("Use the signal and sigprocmask functions instead"); #endif #if defined __USE_POSIX199506 || defined __USE_UNIX98 diff --git a/signal/tst-sigset2.c b/signal/tst-sigset2.c index f653323321..4eef653f95 100644 --- a/signal/tst-sigset2.c +++ b/signal/tst-sigset2.c @@ -9,6 +9,10 @@ #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> +#include <libc-diag.h> + +/* The sigset function is deprecated. */ +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); #define TEST_SIG SIGINT diff --git a/signal/tst-sigsimple.c b/signal/tst-sigsimple.c index d0e6b2f340..56202348bc 100644 --- a/signal/tst-sigsimple.c +++ b/signal/tst-sigsimple.c @@ -20,7 +20,10 @@ #include <signal.h> #include <stdio.h> #include <string.h> +#include <libc-diag.h> +/* The sighold and sigrelse functions are deprecated. */ +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); static int do_test (void)