has_stopped_jobs: s/task_is_stopped/SIGNAL_STOP_STOPPED/
authorOleg Nesterov <oleg@redhat.com>
Thu, 7 Jul 2011 19:33:54 +0000 (21:33 +0200)
committerOleg Nesterov <oleg@redhat.com>
Sun, 17 Jul 2011 18:23:50 +0000 (20:23 +0200)
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>
kernel/exit.c

index b8d3b47bb8816061a1c257defa40365630a98f71..6c7fbbe7d86f29876d4656aefa55af93639da58d 100644 (file)
@@ -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;
 }
 
 /*