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