From 6e9397d12635eae55c9114ed9689413154fed8ce Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 17 Jan 2023 07:19:03 +0000 Subject: ds: introduce awaitpid, switch ProcessPipe users awaitpid is the new API which will eventually replace dwaitpid. It enables early registration of callback handlers. Eventually (once dwaitpid is gone) it'll be able to use fewer waitpid calls. The avoidance of waitpid(-1) in our earlier days was driven by the belief that threads may eventually become relevant for Perl 5, but that's extremely unlikely at this stage. I will still introduce optional threads via C, but they definitely won't be spawning/reaping processes. Argument order to callbacks is swapped (PID first) to allow flattened multiple arguments more natrually. The previous API (allowing only a single argument, as influenced by pthread_create(3)) was more tedious as it involved packing multiple arguments into yet another array. --- t/spawn.t | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 't') diff --git a/t/spawn.t b/t/spawn.t index 5fc99a2a..c22cfcfc 100644 --- a/t/spawn.t +++ b/t/spawn.t @@ -140,13 +140,13 @@ EOF { # ->CLOSE vs ->DESTROY waitpid caller distinction my @c; - my $fh = popen_rd(['true'], undef, { cb => sub { @c = caller } }); + my $fh = popen_rd(['true'], undef, { cb_arg => [sub { @c = caller }] }); ok(close($fh), '->CLOSE fired and successful'); ok(scalar(@c), 'callback fired by ->CLOSE'); ok(grep(!m[/PublicInbox/DS\.pm\z], @c), 'callback not invoked by DS'); @c = (); - $fh = popen_rd(['true'], undef, { cb => sub { @c = caller } }); + $fh = popen_rd(['true'], undef, { cb_arg => [sub { @c = caller }] }); undef $fh; # ->DESTROY ok(scalar(@c), 'callback fired by ->DESTROY'); ok(grep(!m[/PublicInbox/ProcessPipe\.pm\z], @c), @@ -156,8 +156,9 @@ EOF { # children don't wait on siblings use POSIX qw(_exit); pipe(my ($r, $w)) or BAIL_OUT $!; - my $cb = sub { warn "x=$$\n" }; - my $fh = popen_rd(['cat'], undef, { 0 => $r, cb => $cb }); + my @arg; + my $cb = [ sub { @arg = @_; warn "x=$$\n" }, 'hi' ]; + my $fh = popen_rd(['cat'], undef, { 0 => $r, cb_arg => $cb }); my $pp = tied *$fh; my $pid = fork // BAIL_OUT $!; local $SIG{__WARN__} = sub { _exit(1) }; @@ -173,6 +174,9 @@ EOF close $w; close $fh; is($?, 0, 'cat exited'); + is(scalar(@arg), 2, 'callback got args'); + is($arg[1], 'hi', 'passed arg'); + like($arg[0], qr/\A\d+\z/, 'PID'); is_deeply(\@w, [ "x=$$\n" ], 'callback fired from owner'); } -- cgit v1.2.3-24-ge0c7