[PATCH] do_notify_parent_cldstop() cleanup
This patch simplifies the usage of do_notify_parent_cldstop(), it lessens the source and .text size slightly, and makes the code (in my opinion) a bit more readable. I am sending this patch now because I'm afraid Paul will touch do_notify_parent_cldstop() really soon, It's better to cleanup first. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
2d237c6365
commit
bc505a478d
|
@ -678,7 +678,7 @@ static int check_kill_permission(int sig, struct siginfo *info,
|
||||||
|
|
||||||
/* forward decl */
|
/* forward decl */
|
||||||
static void do_notify_parent_cldstop(struct task_struct *tsk,
|
static void do_notify_parent_cldstop(struct task_struct *tsk,
|
||||||
struct task_struct *parent,
|
int to_self,
|
||||||
int why);
|
int why);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -729,14 +729,7 @@ static void handle_stop_signal(int sig, struct task_struct *p)
|
||||||
p->signal->group_stop_count = 0;
|
p->signal->group_stop_count = 0;
|
||||||
p->signal->flags = SIGNAL_STOP_CONTINUED;
|
p->signal->flags = SIGNAL_STOP_CONTINUED;
|
||||||
spin_unlock(&p->sighand->siglock);
|
spin_unlock(&p->sighand->siglock);
|
||||||
if (p->ptrace & PT_PTRACED)
|
do_notify_parent_cldstop(p, (p->ptrace & PT_PTRACED), CLD_STOPPED);
|
||||||
do_notify_parent_cldstop(p, p->parent,
|
|
||||||
CLD_STOPPED);
|
|
||||||
else
|
|
||||||
do_notify_parent_cldstop(
|
|
||||||
p->group_leader,
|
|
||||||
p->group_leader->real_parent,
|
|
||||||
CLD_STOPPED);
|
|
||||||
spin_lock(&p->sighand->siglock);
|
spin_lock(&p->sighand->siglock);
|
||||||
}
|
}
|
||||||
rm_from_queue(SIG_KERNEL_STOP_MASK, &p->signal->shared_pending);
|
rm_from_queue(SIG_KERNEL_STOP_MASK, &p->signal->shared_pending);
|
||||||
|
@ -777,14 +770,7 @@ static void handle_stop_signal(int sig, struct task_struct *p)
|
||||||
p->signal->flags = SIGNAL_STOP_CONTINUED;
|
p->signal->flags = SIGNAL_STOP_CONTINUED;
|
||||||
p->signal->group_exit_code = 0;
|
p->signal->group_exit_code = 0;
|
||||||
spin_unlock(&p->sighand->siglock);
|
spin_unlock(&p->sighand->siglock);
|
||||||
if (p->ptrace & PT_PTRACED)
|
do_notify_parent_cldstop(p, (p->ptrace & PT_PTRACED), CLD_CONTINUED);
|
||||||
do_notify_parent_cldstop(p, p->parent,
|
|
||||||
CLD_CONTINUED);
|
|
||||||
else
|
|
||||||
do_notify_parent_cldstop(
|
|
||||||
p->group_leader,
|
|
||||||
p->group_leader->real_parent,
|
|
||||||
CLD_CONTINUED);
|
|
||||||
spin_lock(&p->sighand->siglock);
|
spin_lock(&p->sighand->siglock);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
@ -1542,14 +1528,20 @@ void do_notify_parent(struct task_struct *tsk, int sig)
|
||||||
spin_unlock_irqrestore(&psig->siglock, flags);
|
spin_unlock_irqrestore(&psig->siglock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void do_notify_parent_cldstop(struct task_struct *tsk, int to_self, int why)
|
||||||
do_notify_parent_cldstop(struct task_struct *tsk, struct task_struct *parent,
|
|
||||||
int why)
|
|
||||||
{
|
{
|
||||||
struct siginfo info;
|
struct siginfo info;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
struct task_struct *parent;
|
||||||
struct sighand_struct *sighand;
|
struct sighand_struct *sighand;
|
||||||
|
|
||||||
|
if (to_self)
|
||||||
|
parent = tsk->parent;
|
||||||
|
else {
|
||||||
|
tsk = tsk->group_leader;
|
||||||
|
parent = tsk->real_parent;
|
||||||
|
}
|
||||||
|
|
||||||
info.si_signo = SIGCHLD;
|
info.si_signo = SIGCHLD;
|
||||||
info.si_errno = 0;
|
info.si_errno = 0;
|
||||||
info.si_pid = tsk->pid;
|
info.si_pid = tsk->pid;
|
||||||
|
@ -1618,8 +1610,7 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
|
||||||
!(current->ptrace & PT_ATTACHED)) &&
|
!(current->ptrace & PT_ATTACHED)) &&
|
||||||
(likely(current->parent->signal != current->signal) ||
|
(likely(current->parent->signal != current->signal) ||
|
||||||
!unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) {
|
!unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) {
|
||||||
do_notify_parent_cldstop(current, current->parent,
|
do_notify_parent_cldstop(current, 1, CLD_TRAPPED);
|
||||||
CLD_TRAPPED);
|
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
schedule();
|
schedule();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1668,25 +1659,25 @@ void ptrace_notify(int exit_code)
|
||||||
static void
|
static void
|
||||||
finish_stop(int stop_count)
|
finish_stop(int stop_count)
|
||||||
{
|
{
|
||||||
|
int to_self;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there are no other threads in the group, or if there is
|
* If there are no other threads in the group, or if there is
|
||||||
* a group stop in progress and we are the last to stop,
|
* a group stop in progress and we are the last to stop,
|
||||||
* report to the parent. When ptraced, every thread reports itself.
|
* report to the parent. When ptraced, every thread reports itself.
|
||||||
*/
|
*/
|
||||||
if (stop_count < 0 || (current->ptrace & PT_PTRACED)) {
|
if (stop_count < 0 || (current->ptrace & PT_PTRACED))
|
||||||
read_lock(&tasklist_lock);
|
to_self = 1;
|
||||||
do_notify_parent_cldstop(current, current->parent,
|
else if (stop_count == 0)
|
||||||
CLD_STOPPED);
|
to_self = 0;
|
||||||
read_unlock(&tasklist_lock);
|
else
|
||||||
}
|
goto out;
|
||||||
else if (stop_count == 0) {
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
do_notify_parent_cldstop(current->group_leader,
|
|
||||||
current->group_leader->real_parent,
|
|
||||||
CLD_STOPPED);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
read_lock(&tasklist_lock);
|
||||||
|
do_notify_parent_cldstop(current, to_self, CLD_STOPPED);
|
||||||
|
read_unlock(&tasklist_lock);
|
||||||
|
|
||||||
|
out:
|
||||||
schedule();
|
schedule();
|
||||||
/*
|
/*
|
||||||
* Now we don't run again until continued.
|
* Now we don't run again until continued.
|
||||||
|
|
Reference in New Issue