diff --git a/include/signal.h b/include/signal.h index 269917c4ec8..6c113f99571 100644 --- a/include/signal.h +++ b/include/signal.h @@ -249,6 +249,14 @@ * (always assumed) */ #define SA_NOCLDWAIT (1 << 2) /* If signo=SIGCHLD, exit status of child * processes will be discarded */ +#define SA_ONSTACK (1 << 3) /* Indicates that a registered stack_t + * will be used */ +#define SA_RESTART (1 << 4) /* Flag to get restarting signals + * (which were the default long ago) */ +#define SA_NODEFER (1 << 5) /* Prevents the current signal from + * being masked in the handler */ +#define SA_RESETHAND (1 << 6) /* Clears the handler when the signal + * is delivered */ /* These are the possible values of the signfo si_code field */ diff --git a/sched/signal/sig_deliver.c b/sched/signal/sig_deliver.c index d8b894e14e1..d0739f97dcb 100644 --- a/sched/signal/sig_deliver.c +++ b/sched/signal/sig_deliver.c @@ -106,8 +106,7 @@ void nxsig_deliver(FAR struct tcb_s *stcb) */ savesigprocmask = stcb->sigprocmask; - newsigprocmask = savesigprocmask | sigq->mask | - SIGNO2SET(sigq->info.si_signo); + newsigprocmask = savesigprocmask | sigq->mask; stcb->sigprocmask = newsigprocmask; #ifndef CONFIG_BUILD_FLAT diff --git a/sched/signal/sig_dispatch.c b/sched/signal/sig_dispatch.c index 67b46fa4058..a07fd0e768a 100644 --- a/sched/signal/sig_dispatch.c +++ b/sched/signal/sig_dispatch.c @@ -93,6 +93,11 @@ static int nxsig_queue_action(FAR struct tcb_s *stcb, siginfo_t *info) sigq->action.sighandler = sigact->act.sa_u._sa_sigaction; sigq->mask = sigact->act.sa_mask; + if ((sigact->act.sa_flags & SA_NODEFER) == 0) + { + sigq->mask |= SIGNO2SET(info->si_signo); + } + memcpy(&sigq->info, info, sizeof(siginfo_t)); /* Put it at the end of the pending signals list */