aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/init.c')
-rw-r--r--gcc/ada/init.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 888ec20..2dc4aa5 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -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);