On Sat, 10 Jan 2004, Lincoln A. Baxter wrote:
> Tim and Steve,
>
> I think this is the same problem I was having before, which I thought
> at the time was an Oracle 9i issue. I stopped working on it for about 9
> months, put I must get us to perl 5.8 for the unicode support, so I was
> looking at it today, and I think we just figured it out (with the help
> of truss).
>
> Read:
>
> perldoc perlvar #search for ALRM.
>
> In particular notice this text:
>
> If your system has the sigaction() function then signal han-
> dlers are installed using it. This means you get reliable sig-
> nal handling. If your system has the SA_RESTART flag it is
> used when signals handlers are installed. This means that sys-
> tem calls for which restarting is supported continue rather
> than returning when a signal arrives. If you want your system
> calls to be interrupted by signal delivery then do something
> like this:
>
> use POSIX ':signal_h';
>
> my $alarm = 0;
> sigaction SIGALRM, new POSIX::SigAction sub { $alarm = 1 }
> or die "Error setting SIGALRM handler: $!\n";
>
> See POSIX.
>
> While this text is also in the perl 5.6.1 perlvar man page, I think that
> perl 5.6.0 does not infact use SA_RESTART (or at least for some reason
> our build of it did not). Running truss -v all on Solaris 5.8 (sun4u
> hardware), reveals that our perl 5.6 does not pass SA_RESTART to the
> sigaction routine, and perl 5.8.x does.
Actually, I'm seeing the non-SA_RESTART behavior with perl 5.8.0! The
problem area is this snippet of PlClient's Comm.pm:
while ($readSize > 0) {
my $result = $socket->read($encodedSize, $readSize,
length($encodedSize));
if (!$result) {
return undef if defined($result);
die "Error while reading socket: $!";
^^^^^^^^^^^^^^^^
}
$readSize -= $result;
}
When the client is in $socket->read() and a child terminates, the read
call returns an undefined value and errno is EINTR. So, unless I'm
misunderstanding your comments, this is the converse from your
observations. If SA_RESTART was being used, I would not expect to see
that error caught.
To bolster my observations, a look at the perl-5.8.0 source shows that
SA_RESTART is only used when perl is built with PERL_OLD_SIGNALS defined:
(from util.c):
#ifdef SA_RESTART
#if defined(PERL_OLD_SIGNALS)
act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
#endif
#endif
#ifdef SA_NOCLDWAIT
if (signo == SIGCHLD && handler == (Sighandler_t)SIG_IGN)
act.sa_flags |= SA_NOCLDWAIT;
#endif
It does not appear to be a runtime choice. This was the only mention I
found in the base perl sources for 'SA_RESTART' - I cannot even locate
where or how this preproc define might get set, and I know I'm not doing
it.
Steve