Messages in this thread Patch in this message | | | Date | Wed, 22 Jun 2011 23:10:26 +0200 | From | Oleg Nesterov <> | Subject | [PATCH 8/8] redefine thread_group_leader() as exit_signal >= 0 |
| |
Change de_thread() to set old_leader->exit_signal = -1. This is good for the consistency, it is no longer the leader and all sub-threads have exit_signal = -1 set by copy_process(CLONE_THREAD).
And this allows us to micro-optimize thread_group_leader(), it can simply check exit_signal >= 0. This also makes sense because we should move ->group_leader from task_struct to signal_struct.
Signed-off-by: Oleg Nesterov <oleg@redhat.com> ---
include/linux/sched.h | 6 ++++-- fs/exec.c | 1 + 2 files changed, 5 insertions(+), 2 deletions(-)
--- ptrace/include/linux/sched.h~8_thread_group_leader 2011-06-22 22:47:13.000000000 +0200 +++ ptrace/include/linux/sched.h 2011-06-22 22:47:14.000000000 +0200 @@ -2285,8 +2285,10 @@ static inline int get_nr_threads(struct return tsk->signal->nr_threads; } -/* de_thread depends on thread_group_leader not being a pid based check */ -#define thread_group_leader(p) (p == p->group_leader) +static inline bool thread_group_leader(struct task_struct *p) +{ + return p->exit_signal >= 0; +} /* Do to the insanities of de_thread it is possible for a process * to have the pid of the thread group leader without actually being --- ptrace/fs/exec.c~8_thread_group_leader 2011-06-22 22:47:00.000000000 +0200 +++ ptrace/fs/exec.c 2011-06-22 22:47:14.000000000 +0200 @@ -963,6 +963,7 @@ static int de_thread(struct task_struct leader->group_leader = tsk; tsk->exit_signal = SIGCHLD; + leader->exit_signal = -1; BUG_ON(leader->exit_state != EXIT_ZOMBIE); leader->exit_state = EXIT_DEAD;
| |