Loading kernel/exit.c +39 −49 Original line number Diff line number Diff line Loading @@ -249,7 +249,7 @@ static int has_stopped_jobs(struct pid *pgrp) struct task_struct *p; do_each_pid_task(pgrp, PIDTYPE_PGID, p) { if (p->state != TASK_STOPPED) if (!task_is_stopped(p)) continue; retval = 1; break; Loading Loading @@ -614,7 +614,7 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced) p->parent = p->real_parent; add_parent(p); if (p->state == TASK_TRACED) { if (task_is_traced(p)) { /* * If it was at a trace stop, turn it into * a normal stop since it's no longer being Loading Loading @@ -1563,60 +1563,51 @@ repeat: } allowed = 1; switch (p->state) { case TASK_TRACED: /* * When we hit the race with PTRACE_ATTACH, * we will not report this child. But the * race means it has not yet been moved to * our ptrace_children list, so we need to * set the flag here to avoid a spurious ECHILD * when the race happens with the only child. */ flag = 1; if (!my_ptrace_child(p)) continue; /*FALLTHROUGH*/ case TASK_STOPPED: if (task_is_stopped_or_traced(p)) { /* * It's stopped now, so it might later * continue, exit, or stop again. * * When we hit the race with PTRACE_ATTACH, we * will not report this child. But the race * means it has not yet been moved to our * ptrace_children list, so we need to set the * flag here to avoid a spurious ECHILD when * the race happens with the only child. */ flag = 1; if (!(options & WUNTRACED) && !my_ptrace_child(p)) if (!my_ptrace_child(p)) { if (task_is_traced(p)) continue; if (!(options & WUNTRACED)) continue; } retval = wait_task_stopped(p, ret == 2, (options & WNOWAIT), infop, (options & WNOWAIT), infop, stat_addr, ru); if (retval == -EAGAIN) goto repeat; if (retval != 0) /* He released the lock. */ goto end; break; default: // case EXIT_DEAD: if (p->exit_state == EXIT_DEAD) } else if (p->exit_state == EXIT_DEAD) { continue; // case EXIT_ZOMBIE: if (p->exit_state == EXIT_ZOMBIE) { } else if (p->exit_state == EXIT_ZOMBIE) { /* * Eligible but we cannot release * it yet: * Eligible but we cannot release it yet: */ if (ret == 2) goto check_continued; if (!likely(options & WEXITED)) continue; retval = wait_task_zombie( p, (options & WNOWAIT), infop, stat_addr, ru); retval = wait_task_zombie(p, (options & WNOWAIT), infop, stat_addr, ru); /* He released the lock. */ if (retval != 0) goto end; break; } } else { check_continued: /* * It's running now, so it might later Loading @@ -1625,12 +1616,11 @@ check_continued: flag = 1; if (!unlikely(options & WCONTINUED)) continue; retval = wait_task_continued( p, (options & WNOWAIT), infop, stat_addr, ru); retval = wait_task_continued(p, (options & WNOWAIT), infop, stat_addr, ru); if (retval != 0) /* He released the lock. */ goto end; break; } } if (!flag) { Loading Loading
kernel/exit.c +39 −49 Original line number Diff line number Diff line Loading @@ -249,7 +249,7 @@ static int has_stopped_jobs(struct pid *pgrp) struct task_struct *p; do_each_pid_task(pgrp, PIDTYPE_PGID, p) { if (p->state != TASK_STOPPED) if (!task_is_stopped(p)) continue; retval = 1; break; Loading Loading @@ -614,7 +614,7 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced) p->parent = p->real_parent; add_parent(p); if (p->state == TASK_TRACED) { if (task_is_traced(p)) { /* * If it was at a trace stop, turn it into * a normal stop since it's no longer being Loading Loading @@ -1563,60 +1563,51 @@ repeat: } allowed = 1; switch (p->state) { case TASK_TRACED: /* * When we hit the race with PTRACE_ATTACH, * we will not report this child. But the * race means it has not yet been moved to * our ptrace_children list, so we need to * set the flag here to avoid a spurious ECHILD * when the race happens with the only child. */ flag = 1; if (!my_ptrace_child(p)) continue; /*FALLTHROUGH*/ case TASK_STOPPED: if (task_is_stopped_or_traced(p)) { /* * It's stopped now, so it might later * continue, exit, or stop again. * * When we hit the race with PTRACE_ATTACH, we * will not report this child. But the race * means it has not yet been moved to our * ptrace_children list, so we need to set the * flag here to avoid a spurious ECHILD when * the race happens with the only child. */ flag = 1; if (!(options & WUNTRACED) && !my_ptrace_child(p)) if (!my_ptrace_child(p)) { if (task_is_traced(p)) continue; if (!(options & WUNTRACED)) continue; } retval = wait_task_stopped(p, ret == 2, (options & WNOWAIT), infop, (options & WNOWAIT), infop, stat_addr, ru); if (retval == -EAGAIN) goto repeat; if (retval != 0) /* He released the lock. */ goto end; break; default: // case EXIT_DEAD: if (p->exit_state == EXIT_DEAD) } else if (p->exit_state == EXIT_DEAD) { continue; // case EXIT_ZOMBIE: if (p->exit_state == EXIT_ZOMBIE) { } else if (p->exit_state == EXIT_ZOMBIE) { /* * Eligible but we cannot release * it yet: * Eligible but we cannot release it yet: */ if (ret == 2) goto check_continued; if (!likely(options & WEXITED)) continue; retval = wait_task_zombie( p, (options & WNOWAIT), infop, stat_addr, ru); retval = wait_task_zombie(p, (options & WNOWAIT), infop, stat_addr, ru); /* He released the lock. */ if (retval != 0) goto end; break; } } else { check_continued: /* * It's running now, so it might later Loading @@ -1625,12 +1616,11 @@ check_continued: flag = 1; if (!unlikely(options & WCONTINUED)) continue; retval = wait_task_continued( p, (options & WNOWAIT), infop, stat_addr, ru); retval = wait_task_continued(p, (options & WNOWAIT), infop, stat_addr, ru); if (retval != 0) /* He released the lock. */ goto end; break; } } if (!flag) { Loading