On Thu, Dec 23, 2004 at 04:03:11PM -0800, Dan McCormick wrote:
> > I briefly considered whether the wheel should guarantee flushing on
> > shutdown, but I decided against it.  Sometimes people may want to shut
> > down a client regardless of the input waiting for it.
> > 
> > Maybe the shutdown methods need flush/immediate options?
> 
> That would definitely be convenient.  Would it be as simple as this?  It
> works with the test case I sent earlier.  I'll re-submit it with a doc patch
> if it looks ok.
> 
> --- Run.pm      Mon Nov 15 23:31:17 2004
> +++ Run.pm.new  Thu Dec 23 15:28:09 2004
> @@ -859,8 +859,13 @@
>  
>  # Shutdown the pipe that leads to the child's STDIN.
>  sub shutdown_stdin {
> -  my $self = shift;
> +  my ($self, %args) = @_;
> +
>    return unless defined $self->[HANDLE_STDIN];
> +
> +  if ($args{flush}) {
> +       $self->[DRIVER_STDIN]->flush($self->[HANDLE_STDIN]);
> +  }
>  
>    $poe_kernel->select_write($self->[HANDLE_STDIN], undef);
> 
> Dan

Your patch will work in a lot of cases, but it won't work in all of
them.  Consider when flush() is called to write to a full pipe.  It
can't block, so it must return while the driver's buffer contains
data.

A more complete solution would be to check the driver's output buffer
after flush().  If it flushed everything, go ahead and shutdown right
away.  Otherwise set a flag in the wheel, and check it after the usual
flush().

-- 
Rocco Caputo - http://poe.perl.org/

Reply via email to