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

Anton Yartsev anton.yartsev at gmail.com
Wed Nov 5 11:54:07 PST 2014


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


-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141105/6e1faf76/attachment.html>


More information about the cfe-commits mailing list