I think my point was "why bother forking at all if we're using open to run a 
subprocess?".

Also, this will fail if the path contains spaces:

+    my $ExecLine = join(' ', $Clang, "-###", $mode, @$Args, "2>&1", "|");
+    open(PS, $ExecLine);

Do newer Perls on newer Windows support the list form of open?

Jordan


> On Nov 5, 2014, at 11:54 , Anton Yartsev <[email protected]> wrote:
> 
> 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 <[email protected] 
>>> <mailto:[email protected]>> 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

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to