diff options
-rw-r--r-- | kernel/exit.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index fc46c9a86d2b..00f0821726f7 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -548,10 +548,6 @@ static inline void choose_new_parent(task_t *p, task_t *reaper, task_t *child_re static void reparent_thread(task_t *p, task_t *father, int traced) { - /* We don't want people slaying init. */ - if (p->exit_signal != -1) - p->exit_signal = SIGCHLD; - if (p->pdeath_signal) /* We already hold the tasklist_lock here. */ group_send_sig_info(p->pdeath_signal, SEND_SIG_NOINFO, p); @@ -571,13 +567,7 @@ static void reparent_thread(task_t *p, task_t *father, int traced) p->parent = p->real_parent; list_add_tail(&p->sibling, &p->parent->children); - /* If we'd notified the old parent about this child's death, - * also notify the new parent. - */ - if (p->exit_state == EXIT_ZOMBIE && p->exit_signal != -1 && - thread_group_empty(p)) - do_notify_parent(p, p->exit_signal); - else if (p->state == TASK_TRACED) { + if (p->state == TASK_TRACED) { /* * If it was at a trace stop, turn it into * a normal stop since it's no longer being @@ -587,6 +577,23 @@ static void reparent_thread(task_t *p, task_t *father, int traced) } } + /* If this is a threaded reparent there is no need to + * notify anyone anything has happened. + */ + if (p->real_parent->group_leader == father->group_leader) + return; + + /* We don't want people slaying init. */ + if (p->exit_signal != -1) + p->exit_signal = SIGCHLD; + + /* If we'd notified the old parent about this child's death, + * also notify the new parent. + */ + if (!traced && p->exit_state == EXIT_ZOMBIE && + p->exit_signal != -1 && thread_group_empty(p)) + do_notify_parent(p, p->exit_signal); + /* * process group orphan check * Case ii: Our child is in a different pgrp |