[PATCH][analyzer] Prevent ccc/c++-analyzer from hanging on Windows.

Anton Yartsev anton.yartsev at gmail.com
Tue Oct 21 06:47:04 PDT 2014


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141021/fc89adea/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ccc-analyzer_fork_open_hang.patch
Type: text/x-diff
Size: 933 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141021/fc89adea/attachment.patch>


More information about the cfe-commits mailing list