Messages in this thread | | | Date | Mon, 20 Jun 2011 21:39:29 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH 6/7] ptrace: kill detah tracehooks |
| |
On 06/17, Tejun Heo wrote: > > This patch kills tracehook_notify_death() by reimplementing the logic > in its caller - exit_notify(). I opted for re-implementation as the > existing code was a bit difficult to wrap one's head around.
I always hated this particular tracehook much more than others ;)
But the patch doesn't look right, please see below.
> - signal = tracehook_notify_death(tsk, &cookie, group_dead); > - if (signal >= 0) > - signal = do_notify_parent(tsk, signal); > + /* > + * Notify interested parent if the whole group is dead. Ptracer > + * should always be notified. If something other than our normal > + * parent is ptracing us, then send it a SIGCHLD instead of > + * honoring exit_signal. exit_signal only has special meaning to > + * our real parent. > + */ > + if (!task_detached(tsk) && thread_group_empty(tsk)) { > + if (!ptrace_reparented(tsk)) > + do_notify_parent(tsk, tsk->exit_signal); > + else > + do_notify_parent(tsk, SIGCHLD);
Forget about ptrace, suppose a single threaded child exits and its parent ignores SIGCHLD. In this case do_notify_parent() sets exit_signal = -1 to mark it dead, we should set exit_state = EXIT_DEAD and release it.
Note! This looks very ugly, I wanted to cleanup this a long ago. I think we should never change ->exit_signal, and do_notify_parent() should return a boolean. I'll try to make the patches tomorrow. Then _perhaps_ this patch will become simpler.
Oleg.
| |