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;
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);