From bea6e0ddd78a3d56a5fcc54b64983dbb286b8a54 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Fri, 26 Mar 2021 18:15:17 +0800 Subject: [PATCH] sched/signal: Implement SA_NODEFER and SA_RESETHAND Signed-off-by: Xiang Xiao Change-Id: I9baa72b272c8877022cd94722824f393c7087721 --- include/signal.h | 8 ++++++++ sched/signal/sig_deliver.c | 3 +-- sched/signal/sig_dispatch.c | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/signal.h b/include/signal.h index 269917c4ec..6c113f9957 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 d8b894e14e..d0739f97dc 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 67b46fa405..a07fd0e768 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 */