args-unsplice-forked.pl revision 1.2
1# test delay before server read, unsplice during client write
2
3use strict;
4use warnings;
5use POSIX;
6
7our %args = (
8    client => {
9	func => sub { errignore(@_); write_stream(@_); },
10	len => 2**17,
11	sndbuf => 2**15,
12    },
13    relay => {
14	func => sub {
15	    my $self = shift;
16	    defined(my $pid = fork())
17		or die "relay func: fork failed: $!";
18	    if ($pid == 0) {
19		sleep 2;
20		setsplice(\*STDIN)
21		    or die ref($self), " unsplice stdin failed: $!";
22		POSIX::_exit(0);
23	    }
24	    sleep 1;
25	    eval { relay($self, @_) };
26	    if ($self->{forward} =~ /splice/) {
27		$@ =~ /^Relay sysread stdin has data:/
28		    or die ref($self), " no data after unsplice: $@";
29	    }
30	    sleep 2;
31	    kill 9, $pid;
32	    (my $kid = waitpid($pid, 0)) > 0
33		or die ref($self), " wait unsplice child failed: $!";
34	    my $status = $?;
35	    my $code;
36	    $code = "exit: ".   WEXITSTATUS($?) if WIFEXITED($?);
37	    $code = "signal: ". WTERMSIG($?)    if WIFSIGNALED($?);
38	    $code = "stop: ".   WSTOPSIG($?)    if WIFSTOPPED($?);
39	    $status == 0
40		or die ref($self), " unsplice child status: $status $code";
41	},
42	rcvbuf => 2**10,
43	sndbuf => 2**10,
44    },
45    server => {
46	func => sub { sleep 3; read_stream(@_); },
47	rcvbuf => 2**15,
48    },
49    noecho => 1,
50    nocheck => 1,
51    len => 131072,
52    md5 => "31e5ad3d0d2aeb1ad8aaa847dfa665c2",
53);
54