mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-18 23:59:53 +00:00
[PATCH] simplify do_signal_stop()
do_signal_stop() considers 'thread_group_empty()' as a special case. This was needed to avoid taking tasklist_lock. Since this lock is unneeded any longer, we can remove this special case and simplify the code even more. Also, before this patch, finish_stop() was called with stop_count == -1 for 'thread_group_empty()' case. This is not strictly wrong, but confusing and unneeded. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Cc: john stultz <johnstul@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a7e5328a06
commit
dac27f4a09
@ -1685,8 +1685,7 @@ out:
|
|||||||
static int do_signal_stop(int signr)
|
static int do_signal_stop(int signr)
|
||||||
{
|
{
|
||||||
struct signal_struct *sig = current->signal;
|
struct signal_struct *sig = current->signal;
|
||||||
struct sighand_struct *sighand = current->sighand;
|
int stop_count;
|
||||||
int stop_count = -1;
|
|
||||||
|
|
||||||
if (!likely(sig->flags & SIGNAL_STOP_DEQUEUED))
|
if (!likely(sig->flags & SIGNAL_STOP_DEQUEUED))
|
||||||
return 0;
|
return 0;
|
||||||
@ -1696,30 +1695,14 @@ static int do_signal_stop(int signr)
|
|||||||
* There is a group stop in progress. We don't need to
|
* There is a group stop in progress. We don't need to
|
||||||
* start another one.
|
* start another one.
|
||||||
*/
|
*/
|
||||||
signr = sig->group_exit_code;
|
|
||||||
stop_count = --sig->group_stop_count;
|
stop_count = --sig->group_stop_count;
|
||||||
current->exit_code = signr;
|
} else {
|
||||||
set_current_state(TASK_STOPPED);
|
|
||||||
if (stop_count == 0)
|
|
||||||
sig->flags = SIGNAL_STOP_STOPPED;
|
|
||||||
}
|
|
||||||
else if (thread_group_empty(current)) {
|
|
||||||
/*
|
/*
|
||||||
* Lock must be held through transition to stopped state.
|
|
||||||
*/
|
|
||||||
current->exit_code = current->signal->group_exit_code = signr;
|
|
||||||
set_current_state(TASK_STOPPED);
|
|
||||||
sig->flags = SIGNAL_STOP_STOPPED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* (sig->group_stop_count == 0)
|
|
||||||
* There is no group stop already in progress.
|
* There is no group stop already in progress.
|
||||||
* We must initiate one now.
|
* We must initiate one now.
|
||||||
*/
|
*/
|
||||||
struct task_struct *t;
|
struct task_struct *t;
|
||||||
|
|
||||||
current->exit_code = signr;
|
|
||||||
sig->group_exit_code = signr;
|
sig->group_exit_code = signr;
|
||||||
|
|
||||||
stop_count = 0;
|
stop_count = 0;
|
||||||
@ -1735,13 +1718,14 @@ static int do_signal_stop(int signr)
|
|||||||
signal_wake_up(t, 0);
|
signal_wake_up(t, 0);
|
||||||
}
|
}
|
||||||
sig->group_stop_count = stop_count;
|
sig->group_stop_count = stop_count;
|
||||||
|
|
||||||
set_current_state(TASK_STOPPED);
|
|
||||||
if (stop_count == 0)
|
|
||||||
sig->flags = SIGNAL_STOP_STOPPED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irq(&sighand->siglock);
|
if (stop_count == 0)
|
||||||
|
sig->flags = SIGNAL_STOP_STOPPED;
|
||||||
|
current->exit_code = sig->group_exit_code;
|
||||||
|
__set_current_state(TASK_STOPPED);
|
||||||
|
|
||||||
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
finish_stop(stop_count);
|
finish_stop(stop_count);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user