3 # If a read or write is interrupted by a signal, Perl will call the
4 # signal handler and then attempt to restart the call. If the handler does
5 # something nasty like close the handle or pop layers, make sure that the
6 # read/write handles this gracefully (for some definition of 'graceful':
7 # principally, don't segfault).
26 skip_all('pipe not implemented');
29 unless (exists $Config{'d_alarm'}) {
30 skip_all('alarm not implemented');
34 # XXX for some reason the stdio layer doesn't seem to interrupt
35 # write system call when the alarm triggers. This makes the tests
38 if (exists $ENV{PERLIO} && $ENV{PERLIO} =~ /stdio/ ) {
39 skip_all('stdio not supported for this script');
43 # on Win32, alarm() won't interrupt the read/write call.
44 # Similar issues with VMS.
45 # On FreeBSD, writes to pipes of 8192 bytes or more use a mechanism
46 # that is not interruptible (see perl #85842 and #84688).
47 # "close during print" also hangs on Solaris 8 (but not 10 or 11).
49 # Also skip on release builds, to avoid other possibly problematic
52 my ($osmajmin) = $Config{osvers} =~ /^(\d+\.\d+)/;
53 if ($^O eq 'VMS' || $^O eq 'MSWin32' || $^O eq 'cygwin' || $^O =~ /freebsd/ || $^O eq 'midnightbsd' ||
54 ($^O eq 'solaris' && $Config{osvers} eq '2.8') || $^O eq 'nto' ||
55 ($^O eq 'darwin' && $osmajmin < 9) ||
56 ((int($]*1000) & 1) == 0)
58 skip_all('various portability issues');
62 my ($in, $out, $st, $sigst, $buf);
67 # make two handles that will always block
70 undef $in; undef $out; # use fresh handles each time
75 $SIG{PIPE} = 'IGNORE';
80 $SIG{ALRM} = sub { $sigst = close($in) ? "ok" : "nok" };
82 $st = read($in, $buf, 1);
84 is($sigst, 'ok', 'read/close: sig handler close status');
85 ok(!$st, 'read/close: read status');
86 ok(!close($in), 'read/close: close status');
91 $SIG{ALRM} = sub { die };
93 $st = eval { read($in, $buf, 1) };
95 ok(!$st, 'read/die: read status');
96 ok(close($in), 'read/die: close status');
98 # This used to be 1_000_000, but on Linux/ppc64 (POWER7) this kept
99 # consistently failing. At exactly 0x100000 it started passing
100 # again. We're hoping this number is bigger than any pipe buffer.
101 my $surely_this_arbitrary_number_is_fine = 0x100000;
106 $SIG{ALRM} = sub { $sigst = close($out) ? "ok" : "nok" };
107 $buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
108 select $out; $| = 1; select STDOUT;
110 $st = print $out $buf;
112 is($sigst, 'nok', 'print/close: sig handler close status');
113 ok(!$st, 'print/close: print status');
114 ok(!close($out), 'print/close: close status');
119 $SIG{ALRM} = sub { die };
120 $buf = "a" x $surely_this_arbitrary_number_is_fine . "\n";
121 select $out; $| = 1; select STDOUT;
123 $st = eval { print $out $buf };
125 ok(!$st, 'print/die: print status');
126 # the close will hang since there's data to flush, so use alarm
128 ok(!eval {close($out)}, 'print/die: close status');
133 # Apparently there's nothing in standard Linux that can cause an
134 # EINTR in close(2); but run the code below just in case it does on some
135 # platform, just to see if it segfaults.
137 $SIG{ALRM} = sub { $sigst = close($in) ? "ok" : "nok" };
145 $SIG{ALRM} = sub { die };
150 # vim: ts=4 sts=4 sw=4: