1f39f8f30Sbluhm# test concurrent read and splice 2f39f8f30Sbluhm 3f39f8f30Sbluhmuse strict; 4f39f8f30Sbluhmuse warnings; 5f39f8f30Sbluhmuse POSIX; 6f39f8f30Sbluhmuse Time::HiRes; 7f39f8f30Sbluhm 8f39f8f30Sbluhmour %args = ( 9f39f8f30Sbluhm client => { 10*ac2ce1ebSbluhm func => sub { errignore(@_); write_stream(@_); }, 11f39f8f30Sbluhm len => 2**20, 12*ac2ce1ebSbluhm nocheck => 1, 13f39f8f30Sbluhm }, 14f39f8f30Sbluhm relay => { 15*ac2ce1ebSbluhm # terminate in time on slow machines 16*ac2ce1ebSbluhm alarm => 25, 17*ac2ce1ebSbluhm down => "Alarm|Shutdown", 18f39f8f30Sbluhm nonblocking => 1, 19f39f8f30Sbluhm func => sub { 20f39f8f30Sbluhm defined(my $pid = fork()) 21f39f8f30Sbluhm or die "relay func: fork failed: $!"; 22f39f8f30Sbluhm if ($pid == 0) { 23*ac2ce1ebSbluhm alarm(25); 24f39f8f30Sbluhm my $n; 25f39f8f30Sbluhm do { 26f39f8f30Sbluhm $n = sysread(STDIN, my $buf, 10); 27f39f8f30Sbluhm } while (!defined($n) || $n); 28f39f8f30Sbluhm POSIX::_exit(0); 29f39f8f30Sbluhm } 30f39f8f30Sbluhm # give the userland a moment to read, even if splicing 31f39f8f30Sbluhm sleep .1; 32f39f8f30Sbluhm relay(@_); 33f39f8f30Sbluhm kill 9, $pid; 34*ac2ce1ebSbluhm waitpid($pid, 0); 35f39f8f30Sbluhm }, 36f39f8f30Sbluhm # As sysread() may extract data from the socket before splicing starts, 37f39f8f30Sbluhm # the spliced content length is not reliable. Disable the checks. 38f39f8f30Sbluhm nocheck => 1, 39f39f8f30Sbluhm }, 40f39f8f30Sbluhm server => { 41f39f8f30Sbluhm func => sub { sleep 2; read_stream(@_); }, 42f39f8f30Sbluhm nocheck => 1, 43f39f8f30Sbluhm }, 44f39f8f30Sbluhm len => 1048576, 45f39f8f30Sbluhm md5 => '6649bbec13f3d7efaedf01c0cfa54f88', 46f39f8f30Sbluhm); 47