Taking Chris' question further... why not implement wait queues (I'm
thinking along the lines of NT). Any session could declare it's interest
on a waitable object... and anyone with a reference to that object could
call wakeup on it. SIGCHLD handling is therefore just a special
case of this - you have a handle on the process, register you want to wait
on it. When the pid dies, the object referring to that PID could get a
wakeup event. If the waitqueue is empty, the process vaporises in a puff
of logic. Else the sessions that declared interest get woken.

Nick.

On Fri, 13 Feb 2004, Chris Fedde wrote:

> On Fri, 13 Feb 2004 23:31:56 -0500  Rocco Caputo wrote:
>  +------------------
>  | Proposal: Registered PIDs.
>  |
>  | Currently SIGCHLD is broadcast to every session that registers a CHLD
>  | signal handler.  Quite often, this means every session with child
>  | processes receives signals for every other one.  They all must track
>  | their children and filter the incoming signals against theirs.
>  |
>  | A conversation in IRC reminded me about this issue.  I suggested the
>  | customary pattern for dealing with broadcast SIGCHLD.
>  |
>  |   One of the parameters is the child PID.  You can return unless
>  |   exists $heap->{mine}{$pid}
>  |
>  | Philip Gwyn and I had just covered the heavyhanded _signal event,
>  | which is in the throes of deprecation.  It further occurred to me that
>  | dispatching SIGCHLD to every session with a handler is often useless,
>  | since most of them don't care one whit about any other session's
>  | process IDs.
>  |
>  |   Maybe an optimization would be a Kernel registry mapping child PIDs
>  |   to sessions.  After you fork, you can call $kernel->forked($pid) to
>  |   focus that PIDs SIGCHLD on the current session.  POE::Wheel::Run
>  |   could do it internally.
>  |
>  |   Unregistered PIDs would still be broadcast around.  And to be fair,
>  |   I guess multiple sessions could register interest in a child PID.
>  |   For whatever that's worth.
>  |
>  | This would require a new POE::Kernel method.  I wish it could be
>  | incorporated into something like sig(CHLD => "event"), but re-
>  | registering the SIGCHLD handler shouldn't be necessary for every new
>  | process.
>  +------------------
>
> Is SIGCHLD the only case where additonal context can be used by the
> Kernel to decide how to dispatch multicast events to sessions?  Is
> there a way to implement this feature so that other signals could
> take advantage of pushing selection behavior into kernel?
>
> --
>

Reply via email to