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

Anton Yartsev anton.yartsev at gmail.com
Thu Oct 30 07:28:29 PDT 2014


Ping!
> 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


-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141030/07e8a25b/attachment.html>


More information about the cfe-commits mailing list