[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