my @t = qw(array scalar scalarref undef);
my $test = sub {
my $x = shift;
+ my @res;
for my $type (@t) {
my $m = "test_$type";
my @ret = $ipc->ipc_do($m);
$ipc->ipc_do($m);
+ $ipc->ipc_async($m, [], sub { push @res, \@_ }, \$m);
+
my $ret = $ipc->ipc_do($m);
my $exp = $ipc->$m;
is_deeply($ret, $exp, "!wantarray $m $x");
+
+ is_deeply(\@res, [ [ \$m, \@exp ] ], "async $m $x");
+ @res = ();
}
+ $ipc->ipc_async_wait(-1);
+ is_deeply(\@res, [], 'no leftover results');
+ $ipc->ipc_async('test_die', ['die test'],
+ sub { push @res, \@_ }, 'die arg');
+ $ipc->ipc_async_wait(1);
+ is(scalar(@res), 1, 'only one result');
+ is(scalar(@{$res[0]}), 2, 'result has 2-element array');
+ is($res[0]->[0], 'die arg', 'got async die arg '.$x);
+ is(ref($res[0]->[1]), 'PublicInbox::IPC::Die',
+ "exception type $x");
+ {
+ my $nr = PublicInbox::IPC::PIPE_BUF();
+ my $count = 0;
+ my $cb = sub { ++$count };
+ $ipc->ipc_async('test_undef', [], $cb) for (1..$nr);
+ $ipc->ipc_async_wait(-1);
+ is($count, $nr, "$x async runs w/o deadlock");
+ }
+
my $ret = eval { $ipc->test_die('phail') };
my $exp = $@;
$ret = eval { $ipc->ipc_do('test_die', 'phail') };