|
@@ -760,7 +760,7 @@ static int de_thread(struct task_struct *tsk)
|
|
*/
|
|
*/
|
|
read_lock(&tasklist_lock);
|
|
read_lock(&tasklist_lock);
|
|
spin_lock_irq(lock);
|
|
spin_lock_irq(lock);
|
|
- if (sig->flags & SIGNAL_GROUP_EXIT) {
|
|
|
|
|
|
+ if (signal_group_exit(sig)) {
|
|
/*
|
|
/*
|
|
* Another group action in progress, just
|
|
* Another group action in progress, just
|
|
* return so that the signal is processed.
|
|
* return so that the signal is processed.
|
|
@@ -778,6 +778,7 @@ static int de_thread(struct task_struct *tsk)
|
|
if (unlikely(tsk->group_leader == task_child_reaper(tsk)))
|
|
if (unlikely(tsk->group_leader == task_child_reaper(tsk)))
|
|
task_active_pid_ns(tsk)->child_reaper = tsk;
|
|
task_active_pid_ns(tsk)->child_reaper = tsk;
|
|
|
|
|
|
|
|
+ sig->group_exit_task = tsk;
|
|
zap_other_threads(tsk);
|
|
zap_other_threads(tsk);
|
|
read_unlock(&tasklist_lock);
|
|
read_unlock(&tasklist_lock);
|
|
|
|
|
|
@@ -802,7 +803,6 @@ static int de_thread(struct task_struct *tsk)
|
|
}
|
|
}
|
|
|
|
|
|
sig->notify_count = count;
|
|
sig->notify_count = count;
|
|
- sig->group_exit_task = tsk;
|
|
|
|
while (atomic_read(&sig->count) > count) {
|
|
while (atomic_read(&sig->count) > count) {
|
|
__set_current_state(TASK_UNINTERRUPTIBLE);
|
|
__set_current_state(TASK_UNINTERRUPTIBLE);
|
|
spin_unlock_irq(lock);
|
|
spin_unlock_irq(lock);
|
|
@@ -871,15 +871,10 @@ static int de_thread(struct task_struct *tsk)
|
|
leader->exit_state = EXIT_DEAD;
|
|
leader->exit_state = EXIT_DEAD;
|
|
|
|
|
|
write_unlock_irq(&tasklist_lock);
|
|
write_unlock_irq(&tasklist_lock);
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
sig->group_exit_task = NULL;
|
|
sig->group_exit_task = NULL;
|
|
sig->notify_count = 0;
|
|
sig->notify_count = 0;
|
|
- /*
|
|
|
|
- * There may be one thread left which is just exiting,
|
|
|
|
- * but it's safe to stop telling the group to kill themselves.
|
|
|
|
- */
|
|
|
|
- sig->flags = 0;
|
|
|
|
|
|
|
|
no_thread_group:
|
|
no_thread_group:
|
|
exit_itimers(sig);
|
|
exit_itimers(sig);
|
|
@@ -1549,7 +1544,7 @@ static inline int zap_threads(struct task_struct *tsk, struct mm_struct *mm,
|
|
int err = -EAGAIN;
|
|
int err = -EAGAIN;
|
|
|
|
|
|
spin_lock_irq(&tsk->sighand->siglock);
|
|
spin_lock_irq(&tsk->sighand->siglock);
|
|
- if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT)) {
|
|
|
|
|
|
+ if (!signal_group_exit(tsk->signal)) {
|
|
tsk->signal->group_exit_code = exit_code;
|
|
tsk->signal->group_exit_code = exit_code;
|
|
zap_process(tsk);
|
|
zap_process(tsk);
|
|
err = 0;
|
|
err = 0;
|