init.c [sgi] (__gnat_error_handler): Update sigaction(2) citation.
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Fri, 22 Jul 2011 08:53:01 +0000 (08:53 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 22 Jul 2011 08:53:01 +0000 (08:53 +0000)
* init.c [sgi] (__gnat_error_handler): Update sigaction(2) citation.
Correct argument types.
Extract code from reason.
(__gnat_install_handler): Assign to act.sa_sigaction.

From-SVN: r176619

gcc/ada/ChangeLog
gcc/ada/init.c

index 1a616a5..27f4169 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-22  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * init.c [sgi] (__gnat_error_handler): Update sigaction(2) citation.
+       Correct argument types.
+       Extract code from reason.
+       (__gnat_install_handler): Assign to act.sa_sigaction.
+
 2011-07-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/Make-lang.in (GNAT1_ADA_OBJS): Move ada/b_gnat1.o to...
index 888ec20..2dc4aa5 100644 (file)
@@ -763,16 +763,31 @@ extern struct Exception_Data _abort_signal;
    connecting that handler, with the effects described in the sigaction
    man page:
 
-          SA_SIGINFO [...]
-          If cleared and the signal is caught, the first argument is
-          also the signal number but the second argument is the signal
-          code identifying the cause of the signal. The third argument
-          points to a sigcontext_t structure containing the receiving
-          process's context when the signal was delivered.  */
+          SA_SIGINFO   If set and the signal is caught, sig is passed as the
+                       first argument to the signal-catching function.  If the
+                       second argument is not equal to NULL, it points to a
+                       siginfo_t structure containing the reason why the
+                       signal was generated [see siginfo(5)]; the third
+                       argument points to a ucontext_t structure containing
+                       the receiving process's context when the signal was
+                       delivered [see ucontext(5)].  If cleared and the signal
+                       is caught, the first argument is also the signal number
+                       but the second argument is the signal code identifying
+                       the cause of the signal. The third argument points to a
+                       sigcontext_t structure containing the receiving
+                       process's context when the signal was delivered. This
+                       is the default behavior (see signal(5) for more
+                       details).  Additionally, when SA_SIGINFO is set for a
+                       signal, multiple occurrences of that signal will be
+                       queued for delivery in FIFO order (see sigqueue(3) for
+                       a more detailed explanation of this concept), if those
+                       occurrences of that signal were generated using
+                       sigqueue(3).  */
 
 static void
-__gnat_error_handler (int sig, int code, sigcontext_t *sc ATTRIBUTE_UNUSED)
+__gnat_error_handler (int sig, siginfo_t *reason, void *uc ATTRIBUTE_UNUSED)
 {
+  int code = reason == NULL ? 0 : reason->si_code;
   struct Exception_Data *exception;
   const char *msg;
 
@@ -859,7 +874,7 @@ __gnat_install_handler (void)
      exceptions.  Make sure that the handler isn't interrupted by another
      signal that might cause a scheduling event!  */
 
-  act.sa_handler = __gnat_error_handler;
+  act.sa_sigaction = __gnat_error_handler;
   act.sa_flags = SA_NODEFER + SA_RESTART;
   sigfillset (&act.sa_mask);
   sigemptyset (&act.sa_mask);