Messages in this thread Patch in this message | | | From | (Eric W. Biederman) | Subject | [PATCH] Only send pdeath_signal when getppid changes. | Date | Tue, 10 Apr 2007 09:16:47 -0600 |
| |
Currently each thread can requrest to be notified when it's parent terminates, and receive a thread specific signal when that occurs. That we set this on a per thread granularity and then send it to the whole thread group seems silly, but whatever.
Currently we send a signal when the results of getppid don't change if our parent thread dies and we are reparented to a different thread. This seems counterintuitive to what I would expect when programming in user space and is a major maitenance issue to continue doing.
The only users I recall using this have non threaded parents and pdeath_signal predates CLONE_THREAD so arguably this code has been broken with threaded parents since the day CLONE_THREAD was introduced and no one ever screamed loudly enough to get it fixed.
So this patch fixes the pdeath_signal behaviour only sending a signal when the results of getppid would change.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> ---
This patch is against 2.6.21-rc6-mm1 (with utrace applied) but except for context in the diff that should not matter.
kernel/exit.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/exit.c b/kernel/exit.c index 1d91de8..1ec0d1f 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -618,10 +618,6 @@ choose_new_parent(struct task_struct *p, struct task_struct *reaper) static void reparent_thread(struct task_struct *p, struct task_struct *father) { - if (p->pdeath_signal) - /* We already hold the tasklist_lock here. */ - group_send_sig_info(p->pdeath_signal, SEND_SIG_NOINFO, p); - /* Move the child from its dying parent to the new one. */ list_move_tail(&p->sibling, &p->parent->children); @@ -635,6 +631,10 @@ reparent_thread(struct task_struct *p, struct task_struct *father) if (p->exit_signal != -1) p->exit_signal = SIGCHLD; + if (p->pdeath_signal) + /* We already hold the tasklist_lock here. */ + group_send_sig_info(p->pdeath_signal, SEND_SIG_NOINFO, p); + /* If we'd notified the old parent about this child's death, * also notify the new parent. */ -- 1.5.0.g53756 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |