diff options
author | Oleg Nesterov <oleg@redhat.com> | 2011-07-07 21:33:54 +0200 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2011-07-17 20:23:50 +0200 |
commit | 961c4675c75112717705fa5c0c53cb9664051479 (patch) | |
tree | d424199346b5dc1c5d27fe920a66a6ea11989d89 /kernel/exit.c | |
parent | bb188d7e64deb0e9cf13a99f44ae0065de5352d6 (diff) | |
download | lwn-961c4675c75112717705fa5c0c53cb9664051479.tar.gz lwn-961c4675c75112717705fa5c0c53cb9664051479.zip |
has_stopped_jobs: s/task_is_stopped/SIGNAL_STOP_STOPPED/
has_stopped_jobs() naively checks task_is_stopped(group_leader). This
was always wrong even without ptrace, group_leader can be dead. And
given that ptrace can change the state to TRACED this is wrong even
in the single-threaded case.
Change the code to check SIGNAL_STOP_STOPPED and simplify the code,
retval + break/continue doesn't make this trivial code more readable.
We could probably add the usual "|| signal->group_stop_count" check
but I don't think this makes sense, the task can start the group-stop
right after the check anyway.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index b8d3b47bb881..6c7fbbe7d86f 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -266,18 +266,16 @@ int is_current_pgrp_orphaned(void) return retval; } -static int has_stopped_jobs(struct pid *pgrp) +static bool has_stopped_jobs(struct pid *pgrp) { - int retval = 0; struct task_struct *p; do_each_pid_task(pgrp, PIDTYPE_PGID, p) { - if (!task_is_stopped(p)) - continue; - retval = 1; - break; + if (p->signal->flags & SIGNAL_STOP_STOPPED) + return true; } while_each_pid_task(pgrp, PIDTYPE_PGID, p); - return retval; + + return false; } /* |