[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