This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add PERL_USE_3ARG_SIGHANDLER macro
authorDavid Mitchell <davem@iabyn.com>
Mon, 11 Nov 2019 10:46:56 +0000 (10:46 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 18 Nov 2019 09:34:40 +0000 (09:34 +0000)
There are a bunch of places in core that do

   #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)

to decide whether the C signal handler function should be declared with,
and called with, 1 arg or 3 args.

This commit just adds

   #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
   #  define PERL_USE_3ARG_SIGHANDLER
   #endif

Then uses the new macro in all other places rather than checking
HAS_SIGACTION and SA_SIGINFO. Thus there is no functional change; it just
makes the code more readable.

However, it turns out that all is not well with core's use of 1-arg
versus 3-arg, and the few commits will fix this.

embed.fnc
embed.h
iperlsys.h
mg.c
perl.h
proto.h

index 4a55e2c..016d5bb 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1683,7 +1683,7 @@ Axpd      |OP*    |op_scope       |NULLOK OP* o
 pe     |void   |set_caret_X
 Apd    |void   |setdefout      |NN GV* gv
 Ap     |HEK*   |share_hek      |NN const char* str|SSize_t len|U32 hash
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
 : Used in perl.c
 Tp     |Signal_t |sighandler   |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
 ATp    |Signal_t |csighandler  |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
diff --git a/embed.h b/embed.h
index a325515..0bfaaa8 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define whichsig_sv(a)         Perl_whichsig_sv(aTHX_ a)
 #define wrap_keyword_plugin(a,b)       Perl_wrap_keyword_plugin(aTHX_ a,b)
 #define wrap_op_checker(a,b,c) Perl_wrap_op_checker(aTHX_ a,b,c)
-#if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO))
+#if !(defined(PERL_USE_3ARG_SIGHANDLER))
 #define csighandler            Perl_csighandler
 #endif
 #if !defined(EBCDIC)
 #define pad_setsv(a,b)         Perl_pad_setsv(aTHX_ a,b)
 #define pad_sv(a)              Perl_pad_sv(aTHX_ a)
 #endif
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-#define csighandler            Perl_csighandler
-#endif
 #if defined(HAVE_INTERP_INTERN)
 #define sys_intern_clear()     Perl_sys_intern_clear(aTHX)
 #define sys_intern_init()      Perl_sys_intern_init(aTHX)
 #define warn_nocontext         Perl_warn_nocontext
 #define warner_nocontext       Perl_warner_nocontext
 #endif
+#if defined(PERL_USE_3ARG_SIGHANDLER)
+#define csighandler            Perl_csighandler
+#endif
 #if defined(UNLINK_ALL_VERSIONS)
 #define unlnk(a)               Perl_unlnk(aTHX_ a)
 #endif
 #define my_nl_langinfo         S_my_nl_langinfo
 #    endif
 #  endif
-#  if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO))
-#define sighandler             Perl_sighandler
-#  endif
 #  if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
 #define do_exec(a)             Perl_do_exec(aTHX_ a)
 #  endif
+#  if !(defined(PERL_USE_3ARG_SIGHANDLER))
+#define sighandler             Perl_sighandler
+#  endif
 #  if !(defined(_MSC_VER))
 #define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
 #  endif
 #  if defined(HAS_PIPE)
 #define PerlProc_pipe_cloexec(a)       Perl_PerlProc_pipe_cloexec(aTHX_ a)
 #  endif
-#  if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-#define sighandler             Perl_sighandler
-#  endif
 #  if defined(HAS_SOCKET)
 #define PerlSock_accept_cloexec(a,b,c) Perl_PerlSock_accept_cloexec(aTHX_ a,b,c)
 #define PerlSock_socket_cloexec(a,b,c) Perl_PerlSock_socket_cloexec(aTHX_ a,b,c)
 #  if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
 #define pidgone(a,b)           S_pidgone(aTHX_ a,b)
 #  endif
+#  if defined(PERL_USE_3ARG_SIGHANDLER)
+#define sighandler             Perl_sighandler
+#  endif
 #  if defined(USE_C_BACKTRACE)
 #define get_c_backtrace(a,b)   Perl_get_c_backtrace(aTHX_ a,b)
 #  endif
index b4a92ea..de2dad6 100644 (file)
@@ -51,7 +51,7 @@
 #include "perlio.h"
 
 #ifndef Sighandler_t
-#  if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#  ifdef PERL_USE_3ARG_SIGHANDLER
 typedef Signal_t (*Sighandler_t) (int, Siginfo_t*, void*);
 #  else
 typedef Signal_t (*Sighandler_t) (int);
diff --git a/mg.c b/mg.c
index 7b7bd5a..998b4d8 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -62,7 +62,7 @@ tie.
 #  include <sys/prctl.h>
 #endif
 
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
 Signal_t Perl_csighandler(int sig, Siginfo_t *, void *);
 #else
 Signal_t Perl_csighandler(int sig);
@@ -1487,7 +1487,7 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
 }
 
 Signal_t
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
 Perl_csighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
 #else
 Perl_csighandler(int sig)
@@ -1498,7 +1498,8 @@ Perl_csighandler(int sig)
 #else
     dTHX;
 #endif
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+
+#ifdef PERL_USE_3ARG_SIGHANDLER
 #if defined(__cplusplus) && defined(__GNUC__)
     /* g++ doesn't support PERL_UNUSED_DECL, so the sip and uap
      * parameters would be warned about. */
@@ -1506,6 +1507,7 @@ Perl_csighandler(int sig)
     PERL_UNUSED_ARG(uap);
 #endif
 #endif
+
 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
     (void) rsignal(sig, PL_csighandlerp);
     if (PL_sig_ignoring[sig]) return;
@@ -1531,7 +1533,7 @@ Perl_csighandler(int sig)
           (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
        /* Call the perl level handler now--
         * with risk we may be in malloc() or being destructed etc. */
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
        (*PL_sighandlerp)(sig, NULL, NULL);
 #else
        (*PL_sighandlerp)(sig);
@@ -1613,7 +1615,7 @@ Perl_despatch_signals(pTHX)
            }
 #endif
            PL_psig_pend[sig] = 0;
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
            (*PL_sighandlerp)(sig, NULL, NULL);
 #else
            (*PL_sighandlerp)(sig);
@@ -3318,7 +3320,7 @@ Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
 }
 
 Signal_t
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
 Perl_sighandler(int sig, Siginfo_t *sip, void *uap)
 #else
 Perl_sighandler(int sig)
diff --git a/perl.h b/perl.h
index c94a1f4..7d7a465 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2794,6 +2794,10 @@ typedef struct padname PADNAME;
 #endif
 
 
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#  define PERL_USE_3ARG_SIGHANDLER
+#endif
+
 /* Siginfo_t:
  * This is an alias for the OS's siginfo_t, except that where the OS
  * doesn't support it, declare a dummy version instead. This allows us to
diff --git a/proto.h b/proto.h
index c3cd7c8..8c3018f 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -4094,12 +4094,6 @@ STATIC const char*       S_my_nl_langinfo(const int item, bool toggle);
 #define PERL_ARGS_ASSERT_MY_NL_LANGINFO
 #  endif
 #endif
-#if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO))
-PERL_CALLCONV Signal_t Perl_csighandler(int sig);
-#define PERL_ARGS_ASSERT_CSIGHANDLER
-PERL_CALLCONV Signal_t Perl_sighandler(int sig);
-#define PERL_ARGS_ASSERT_SIGHANDLER
-#endif
 #if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
 PERL_CALLCONV bool     Perl_do_exec(pTHX_ const char* cmd);
 #define PERL_ARGS_ASSERT_DO_EXEC       \
@@ -4112,6 +4106,12 @@ PERL_CALLCONV void*      Perl_my_cxt_init(pTHX_ int *indexp, size_t size);
        assert(indexp)
 #  endif
 #endif
+#if !(defined(PERL_USE_3ARG_SIGHANDLER))
+PERL_CALLCONV Signal_t Perl_csighandler(int sig);
+#define PERL_ARGS_ASSERT_CSIGHANDLER
+PERL_CALLCONV Signal_t Perl_sighandler(int sig);
+#define PERL_ARGS_ASSERT_SIGHANDLER
+#endif
 #if !(defined(_MSC_VER))
 PERL_CALLCONV_NO_RET int       Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg)
                        __attribute__noreturn__;
@@ -4564,12 +4564,6 @@ PERL_CALLCONV int        Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd)
        assert(pipefd)
 
 #endif
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-PERL_CALLCONV Signal_t Perl_csighandler(int sig, Siginfo_t *info, void *uap);
-#define PERL_ARGS_ASSERT_CSIGHANDLER
-PERL_CALLCONV Signal_t Perl_sighandler(int sig, Siginfo_t *info, void *uap);
-#define PERL_ARGS_ASSERT_SIGHANDLER
-#endif
 #if defined(HAS_SOCKET)
 PERL_CALLCONV int      Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr, Sock_size_t *addrlen)
                        __attribute__warn_unused_result__;
@@ -6441,6 +6435,12 @@ PERL_CALLCONV Malloc_t   Perl_mem_log_realloc(const UV n, const UV typesize, const
 STATIC void    S_pidgone(pTHX_ Pid_t pid, int status);
 #define PERL_ARGS_ASSERT_PIDGONE
 #endif
+#if defined(PERL_USE_3ARG_SIGHANDLER)
+PERL_CALLCONV Signal_t Perl_csighandler(int sig, Siginfo_t *info, void *uap);
+#define PERL_ARGS_ASSERT_CSIGHANDLER
+PERL_CALLCONV Signal_t Perl_sighandler(int sig, Siginfo_t *info, void *uap);
+#define PERL_ARGS_ASSERT_SIGHANDLER
+#endif
 #if defined(UNLINK_ALL_VERSIONS)
 PERL_CALLCONV I32      Perl_unlnk(pTHX_ const char* f);
 #define PERL_ARGS_ASSERT_UNLNK \