|
@@ -231,6 +231,40 @@ void flush_signals(struct task_struct *t)
|
|
|
spin_unlock_irqrestore(&t->sighand->siglock, flags);
|
|
|
}
|
|
|
|
|
|
+static void __flush_itimer_signals(struct sigpending *pending)
|
|
|
+{
|
|
|
+ sigset_t signal, retain;
|
|
|
+ struct sigqueue *q, *n;
|
|
|
+
|
|
|
+ signal = pending->signal;
|
|
|
+ sigemptyset(&retain);
|
|
|
+
|
|
|
+ list_for_each_entry_safe(q, n, &pending->list, list) {
|
|
|
+ int sig = q->info.si_signo;
|
|
|
+
|
|
|
+ if (likely(q->info.si_code != SI_TIMER)) {
|
|
|
+ sigaddset(&retain, sig);
|
|
|
+ } else {
|
|
|
+ sigdelset(&signal, sig);
|
|
|
+ list_del_init(&q->list);
|
|
|
+ __sigqueue_free(q);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sigorsets(&pending->signal, &signal, &retain);
|
|
|
+}
|
|
|
+
|
|
|
+void flush_itimer_signals(void)
|
|
|
+{
|
|
|
+ struct task_struct *tsk = current;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&tsk->sighand->siglock, flags);
|
|
|
+ __flush_itimer_signals(&tsk->pending);
|
|
|
+ __flush_itimer_signals(&tsk->signal->shared_pending);
|
|
|
+ spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
|
|
|
+}
|
|
|
+
|
|
|
void ignore_signals(struct task_struct *t)
|
|
|
{
|
|
|
int i;
|