NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/47524: make(1) loops in Job_CatchOutput()
The following reply was made to PR bin/47524; it has been noted by GNATS.
From: Andreas Gustafsson <gson%gson.org@localhost>
To: dsl%NetBSD.org@localhost
Cc: christos%NetBSD.org@localhost,
gnats-bugs%NetBSD.org@localhost,
gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost,
gson%gson.org@localhost (Andreas Gustafsson)
Subject: Re: bin/47524: make(1) loops in Job_CatchOutput()
Date: Mon, 4 Feb 2013 21:23:02 +0200
Hi David,
You wrote:
> > I believe the "while" loop added by this change is where make is now
> > looping.
>
> I'd guess that fd in non-blocking
Yes - I believe you made it non-blocking as part of job.c revision
1.122, where the commit message says "Common up the code that creates
all the pipes - making them all non-block on the read side in the
process".
> so EAGAIN would just mean that the pipe is empty.
Yes.
> The purpose of the read() is to empty the pipe, If it is already empty
> it won't matter.
Agreed.
> I think you'll find the sigchild handler writes into it
Yes, I know - I wrote that code back in 2002.
> Most likely two children finishing at once only write 1 character,
I don't think that can trigger the bug. The read() happens right
after a poll(), and regardless of how many characters are in the pipe,
if the poll indicates the fd is readable, it should be readable.
> or some path comes in with nready < 0 ...
That seems more likely. There is actually only one "path in" - nready
is set by the poll on the previous line
nready = poll(fds + 1 - wantToken, nfds - 1 + wantToken, POLL_MSEC);
Can you please explain the reasoning behind the following change you
made in job.c 1.122 - why is a failing poll treated as if the
childExitJob fd is ready?
- nready = poll(fds + 1 - wantToken, nfds + 1 - wantToken, POLL_MSEC);
- if (nready <= 0)
- return;
+ nready = poll(fds + 1 - wantToken, nfds - 1 + wantToken, POLL_MSEC);
- if (readyfd(&childExitJob)) {
+ if (nready < 0 || readyfd(&childExitJob)) {
In any case, christos' "fix" of looping five times can't possibly be
correct. The code worked before the loop was added, and should be
fixed by removing the loop, not by looping some magic number of times.
--
Andreas Gustafsson, gson%gson.org@localhost
Home |
Main Index |
Thread Index |
Old Index