Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 97393
b: refs/heads/master
c: cbaffba
h: refs/heads/master
i:
  97391: 8ce6072
v: v3
  • Loading branch information
Oleg Nesterov authored and Linus Torvalds committed May 26, 2008
1 parent 0976004 commit 017b834
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c8e85b4f4b9ee23bf0e79bdeb3da274a0f9c663f
refs/heads/master: cbaffba12ce08beb3e80bfda148ee0fa14aac188
1 change: 1 addition & 0 deletions trunk/fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,7 @@ static int de_thread(struct task_struct *tsk)

no_thread_group:
exit_itimers(sig);
flush_itimer_signals();
if (leader)
release_task(leader);

Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -1848,7 +1848,9 @@ extern void exit_thread(void);
extern void exit_files(struct task_struct *);
extern void __cleanup_signal(struct signal_struct *);
extern void __cleanup_sighand(struct sighand_struct *);

extern void exit_itimers(struct signal_struct *);
extern void flush_itimer_signals(void);

extern NORET_TYPE void do_group_exit(int);

Expand Down
34 changes: 34 additions & 0 deletions trunk/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 017b834

Please sign in to comment.