On Fri, Dec 07, 2001 at 11:17:14AM -0500, Jason Boxman wrote:
> On Friday 07 December 2001 07:02 am, you wrote:
> <snip>
> >
> > > I use STDERR to signal The Wheel::Run's job completion as I'm using
> > > STDOUT as a data stream channel.  When I get a specific 'done' event from
> > > STDERR I kill the wheel.  I guess it's possible the STDERR event is
> > > caught before the STDOUT pipe is flushed.  The sleep 2; fixed this in
> > > most instances, but I still end up with lost data 5-10% of the time.
> >
> > Please do not do things like that. You cannot avoid races with delays, even
> > if they are really big. You should be happy instead, that you found it :)
> > Is this behaviour because input events now go through the queue, and
> > signals not ? Or did I miss something ...

[...]

> I don't know if this has to do with Input Events and the queue.  I've always 
> experienced this behavior with CVS.  I haven't tested with earlier code.

Which is odd, because STDOUT and STDERR in the child process are made
unbuffered, and I explicitly close those filehandles before exiting.

      $program->();

      # In case flushing them wasn't good enough.
      close STDOUT if defined fileno(STDOUT);
      close STDERR if defined fileno(STDERR);

Can you put together a simple program that loses data?  I'll merge it
into the Wheel::Run tests, and I'll know for sure when it's fixed.

-- Rocco Caputo / [EMAIL PROTECTED] / poe.perl.org / poe.sourceforge.net

Reply via email to