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

Anton Yartsev anton.yartsev at gmail.com
Thu Oct 30 11:46:54 PDT 2014


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 <anton.yartsev at gmail.com 
> <mailto:anton.yartsev at gmail.com>> 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

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


More information about the cfe-commits mailing list