about summary refs log tree commit homepage
path: root/t/spawn.t
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-01-17 07:19:03 +0000
committerEric Wong <e@80x24.org>2023-01-18 23:25:48 +0000
commit6e9397d12635eae55c9114ed9689413154fed8ce (patch)
tree4ffa8148f76b2fd4c71651df0f2e682f16dfe8d0 /t/spawn.t
parenta1ee3e0d84fedc4a2dd4e16e7054ee6fdfbe111a (diff)
downloadpublic-inbox-6e9397d12635eae55c9114ed9689413154fed8ce.tar.gz
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.
Diffstat (limited to 't/spawn.t')
-rw-r--r--t/spawn.t12
1 files changed, 8 insertions, 4 deletions
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');
 }