It seems that fork is the only native perl mean for creating
subprocesses. There is a number of packages that provide means for
spawning at cpan.org, but they are not guarantee to be included at the
users perl distribution.
Looking at this code, it's weird that we're doing this as a fork/exec
(or not-exec) at all. Why can't we just spawn a sub-process?
Jordan
On Oct 21, 2014, at 6:47 , Anton Yartsev <[email protected]
<mailto:[email protected]>> wrote:
Hi all,
Attached is the patch that prevents ccc/c++-analyzer from hang if
launched with ActivePerl or Strawberry Perl interpreters.
The patch replaces the code that creates a pipe from child to parent
to the more portable explicit writing to parent, this prevent
interpreters from hang.
The conditions for hang are: child should open a pipe to the parent
and parent should read from the child, otherwise no hang.
The problem is possibly caused by the bug in emulation of 'fork' by
Perl interpreters on Windows. From perlfork
<http://perldoc.perl.org/perlfork.html> documentation, BUGS section:
"In certain cases, the OS-level handles created by the pipe(),
socket(), and accept() operators are apparently not duplicated
accurately in pseudo-processes. This only happens in some situations,
but where it does happen, it may result in deadlocks between the read
and write ends of pipe handles, or inability to send or receive data
across socket handles."
An example from perlfork documentation also hangs:
# simulate open(FOO, "-|")
sub pipe_from_fork ($) {
my $parent = shift;
pipe $parent, my $child or die;
my $pid = fork();
die "fork() failed: $!" unless defined $pid;
if ($pid) {
close $child;
}
else {
close $parent;
open(STDOUT, ">&=" . fileno($child)) or die;
}
$pid;
}
if (pipe_from_fork('BAR')) {
# parent
while (<BAR>) { print; }
close BAR;
}
else {
# child
print "pipe_from_fork\n";
exit(0);
}
The hang is not reproduced only with the MSYS Perl.
OK to commit?
--
Anton
<ccc-analyzer_fork_open_hang.patch>
--
Anton
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits