diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index b037b12ce04ba8..2f2a5c233f6123 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -768,7 +768,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) } static int -specific_force_sig_info(int sig, struct task_struct *t) +__specific_force_sig_info(int sig, struct task_struct *t) { if (!t->sig) return -ESRCH; @@ -781,6 +781,20 @@ specific_force_sig_info(int sig, struct task_struct *t) return specific_send_sig_info(sig, (void *)2, t, 0); } +void +force_sig_specific(int sig, struct task_struct *t) +{ + unsigned long int flags; + + spin_lock_irqsave(&t->sig->siglock, flags); + if (t->sig->action[sig-1].sa.sa_handler == SIG_IGN) + t->sig->action[sig-1].sa.sa_handler = SIG_DFL; + sigdelset(&t->blocked, sig); + recalc_sigpending_tsk(t); + specific_send_sig_info(sig, (void *)2, t, 0); + spin_unlock_irqrestore(&t->sig->siglock, flags); +} + #define can_take_signal(p, sig) \ (((unsigned long) p->sig->action[sig-1].sa.sa_handler > 1) && \ !sigismember(&p->blocked, sig) && (task_curr(p) || !signal_pending(p))) @@ -846,7 +860,7 @@ int __broadcast_thread_group(struct task_struct *p, int sig) int err = 0; for_each_task_pid(p->tgid, PIDTYPE_TGID, tmp, l, pid) - err = specific_force_sig_info(sig, tmp); + err = __specific_force_sig_info(sig, tmp); return err; } |
