summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2019-11-11 10:46:56 +0000
committerDavid Mitchell <davem@iabyn.com>2019-11-18 09:34:40 +0000
commit5e7940ceb0d598dfa2aefdcdbda1f1dd8caa6bfd (patch)
treebba6083512c9b38309f000f789e1721c66e0a7e5
parente7124897b9f4ae403795f9db247a331b6da9751e (diff)
downloadperl-5e7940ceb0d598dfa2aefdcdbda1f1dd8caa6bfd.tar.gz
add PERL_USE_3ARG_SIGHANDLER macro
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.
-rw-r--r--embed.fnc2
-rw-r--r--embed.h20
-rw-r--r--iperlsys.h2
-rw-r--r--mg.c14
-rw-r--r--perl.h4
-rw-r--r--proto.h24
6 files changed, 36 insertions, 30 deletions
diff --git a/embed.fnc b/embed.fnc
index 4a55e2ccd3..016d5bb548 100644
--- 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 a3255155ab..0bfaaa8163 100644
--- a/embed.h
+++ b/embed.h
@@ -761,7 +761,7 @@
#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)
@@ -808,9 +808,6 @@
#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)
@@ -848,6 +845,9 @@
#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
@@ -1446,12 +1446,12 @@
#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
@@ -1550,9 +1550,6 @@
# 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)
@@ -1944,6 +1941,9 @@
# 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
diff --git a/iperlsys.h b/iperlsys.h
index b4a92ea574..de2dad65bb 100644
--- a/iperlsys.h
+++ b/iperlsys.h
@@ -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 7b7bd5ac0f..998b4d8f92 100644
--- 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 c94a1f48ad..7d7a465851 100644
--- 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 c3cd7c871d..8c3018f3cf 100644
--- 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 \