On Mon, Dec 20, 2004 at 10:44:23PM -0800, Dan McCormick wrote:
>
> Shouldn't the code below print 1, 2, 3, 4 on separate lines to the file
> /tmp/test.txt?
>
> If I comment out lines 537-538 of POE::Wheel::Run.pm, namely:
>
> $poe_kernel->select_pause_write($self->[HANDLE_STDIN])
> unless ($self->[OCTETS_STDIN]);
>
> ... things work as (I) expected. Some cursory debugging suggests POE isn't
> flushing the buffer when the state returns, as the docs indicate.
They don't quite work the way I expect, but I think you'll agree that
teh problem's over in shutdown_stdin() (around line 872):
# Shutdown the pipe that leads to the child's STDIN.
sub shutdown_stdin {
my $self = shift;
return unless defined $self->[HANDLE_STDIN];
$poe_kernel->select_write($self->[HANDLE_STDIN], undef);
eval { local $^W = 0; shutdown($self->[HANDLE_STDIN], 1) };
close $self->[HANDLE_STDIN] if $@;
}
The problem's fairly obvious. Your test case calls put() to prime the
STDIN buffer, then it calls shutdown_stdin() to close STDIN.
Unfortunately, the wheel also stops select_write() for the handle.
That prevents the buffer from ever being flushed.
The proper thing to do is perhaps to set a shutdown flag if there is
pending input for the child process, and do the actual shutdown when
the input has flushed.
> Also, even with the commented-out lines, it looks like I still need the
> 'doit' and 'shutdown' events to be separate (i.e., combining everything into
> the _start event doesn't work). Is that behavior intentional?
I think it's creating a race condition where your expected behavior
occurs. It seems to be working only by coincidence.
--
Rocco Caputo - http://poe.perl.org/
|
Try Searching:
servers, voip, java, networking, microsoft ...
|
|
|
|