This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add Siginfo_t
authorDavid Mitchell <davem@iabyn.com>
Thu, 7 Nov 2019 12:30:14 +0000 (12:30 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 18 Nov 2019 09:34:40 +0000 (09:34 +0000)
From the code comments:

    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
    have signal handler functions which always have a Siginfo_t parameter
    regardless of platform, (and which will just be passed a NULL value
    where the OS doesn't support HAS_SIGACTION).

It doesn't actually do anything useful yet, but will shortly allow
signal handler functions to be rationalised.

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

index 1a9d3bf..4a55e2c 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1685,8 +1685,8 @@ 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)
 : 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
+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
 #else
 Tp     |Signal_t |sighandler   |int sig
 ATp    |Signal_t |csighandler  |int sig
index ee2c503..b4a92ea 100644 (file)
@@ -52,7 +52,7 @@
 
 #ifndef Sighandler_t
 #  if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-typedef Signal_t (*Sighandler_t) (int, siginfo_t*, void*);
+typedef Signal_t (*Sighandler_t) (int, Siginfo_t*, void*);
 #  else
 typedef Signal_t (*Sighandler_t) (int);
 #  endif
diff --git a/mg.c b/mg.c
index 295ffc6..7b7bd5a 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -63,7 +63,7 @@ tie.
 #endif
 
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-Signal_t Perl_csighandler(int sig, siginfo_t *, void *);
+Signal_t Perl_csighandler(int sig, Siginfo_t *, void *);
 #else
 Signal_t Perl_csighandler(int sig);
 #endif
@@ -1488,7 +1488,7 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
 
 Signal_t
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
+Perl_csighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
 #else
 Perl_csighandler(int sig)
 #endif
@@ -3319,7 +3319,7 @@ Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
 
 Signal_t
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-Perl_sighandler(int sig, siginfo_t *sip, void *uap)
+Perl_sighandler(int sig, Siginfo_t *sip, void *uap)
 #else
 Perl_sighandler(int sig)
 #endif
diff --git a/perl.h b/perl.h
index e2fe628..c94a1f4 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2793,6 +2793,24 @@ typedef struct padname PADNAME;
 #  define USE_ENVIRON_ARRAY
 #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
+ * have signal handler functions which always have a Siginfo_t parameter
+ * regardless of platform, (and which will just be passed a NULL value
+ * where the OS doesn't support HAS_SIGACTION).
+ */
+
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+    typedef siginfo_t Siginfo_t;
+#else
+    typedef struct {
+        int si_signo;
+    } Siginfo_t;
+#endif
+
+
 /*
  * initialise to avoid floating-point exceptions from overflow, etc
  */
diff --git a/proto.h b/proto.h
index bae22c2..c3cd7c8 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -4565,9 +4565,9 @@ PERL_CALLCONV int Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd)
 
 #endif
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
-PERL_CALLCONV Signal_t Perl_csighandler(int sig, siginfo_t *info, void *uap);
+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);
+PERL_CALLCONV Signal_t Perl_sighandler(int sig, Siginfo_t *info, void *uap);
 #define PERL_ARGS_ASSERT_SIGHANDLER
 #endif
 #if defined(HAS_SOCKET)