Skip to content

Instantly share code, notes, and snippets.

@hinrik
Created May 19, 2011 02:42
Show Gist options
  • Save hinrik/980079 to your computer and use it in GitHub Desktop.
Save hinrik/980079 to your computer and use it in GitHub Desktop.
SIGCHLD sometimes not delivered. Race condition?
use strict;
use warnings FATAL => 'all';
use POE;
use POE::Quickie;
use Test::More tests => 5;
POE::Session->create(
package_states => [
(__PACKAGE__) => [qw(
_start
stdout
stderr
)],
],
);
POE::Kernel->run;
sub _start {
my $heap = $_[HEAP];
my $quickie = POE::Quickie->new(trace => 1);
$quickie->run(
Program => sub { print "foo\n" },
StdoutEvent => 'stdout',
Context => 'baz',
);
}
sub stdout {
my ($heap, $output, $pid, $context) = @_[HEAP, ARG0..ARG2];
is($output, 'foo', 'Got stdout');
is($context, 'baz', 'Got context');
my $procs = POE::Quickie->processes();
is($procs->{$pid}, 'baz', '$quickie->processes() works');
POE::Quickie->run(
Program => sub { warn "bar\n" },
StderrEvent => 'stderr',
Context => 'quux',
);
}
sub stderr {
my ($heap, $error, $context) = @_[HEAP, ARG0, ARG2];
is($error, 'bar', 'Got stderr');
is($context, 'quux', 'Got context');
}
$ for i in {1..1000}; do prove -vl 02_success.t; done
t/02_success.t ..
1..5
=== 15671 === 2 -> _start (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Kernel.pm at 1413)
=== 15671 === 2 -> _create_wheel (from /mnt/stuff/src/my-cpan/poe-quickie/lib/POE/Quickie.pm at 93)
=== 15671 === 2 -> POE::Wheel::Run(1) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> POE::Wheel::Run(1) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> _child_stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Wheel/Run.pm at 691)
ok 1 - Got stdout
ok 2 - Got context
ok 3 - $quickie->processes() works
=== 15671 === 2 -> _create_wheel (from /mnt/stuff/src/my-cpan/poe-quickie/lib/POE/Quickie.pm at 93)
=== 15671 === 2 -> POE::Wheel::Run(2) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> _child_stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Wheel/Run.pm at 791)
ok 4 - Got stderr
ok 5 - Got context
=== 15671 === 2 -> POE::Wheel::Run(1) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> POE::Wheel::Run(2) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> _child_signal (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/Signals.pm at 602)
=== 15671 === 2 -> POE::Wheel::Run(2) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15671 === 2 -> _child_signal (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/Signals.pm at 602)
=== 15671 === 2 -> _stop (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/Sessions.pm at 571)
ok
All tests successful.
Files=1, Tests=5, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.08 cusr 0.01 csys = 0.13 CPU)
Result: PASS
t/02_success.t ..
1..5
=== 15675 === 2 -> _start (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Kernel.pm at 1413)
=== 15675 === 2 -> _create_wheel (from /mnt/stuff/src/my-cpan/poe-quickie/lib/POE/Quickie.pm at 93)
=== 15675 === 2 -> POE::Wheel::Run(1) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15675 === 2 -> POE::Wheel::Run(1) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15675 === 2 -> _child_stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Wheel/Run.pm at 691)
ok 1 - Got stdout
ok 2 - Got context
ok 3 - $quickie->processes() works
=== 15675 === 2 -> _create_wheel (from /mnt/stuff/src/my-cpan/poe-quickie/lib/POE/Quickie.pm at 93)
=== 15675 === 2 -> POE::Wheel::Run(2) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15675 === 2 -> _child_stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Wheel/Run.pm at 791)
ok 4 - Got stderr
ok 5 - Got context
=== 15675 === 2 -> POE::Wheel::Run(1) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15675 === 2 -> POE::Wheel::Run(2) -> select stdout (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
=== 15675 === 2 -> _child_signal (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/Signals.pm at 602)
=== 15675 === 2 -> POE::Wheel::Run(2) -> select stderr (from /home/hinrik/perl5/perlbrew/perls/perl-5.13.11/lib/site_perl/5.13.11/POE/Resource/FileHandles.pm at 240)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment