[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