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()



On Feb 4,  9:23pm, gson%gson.org@localhost (Andreas Gustafsson) wrote:
-- Subject: Re: bin/47524: make(1) loops in Job_CatchOutput()

| 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.

I agree with that (magic loop count), but poll returning < 0 should not
attempt a read.  the the sentinel can be removed from the loop.

christos


Home | Main Index | Thread Index | Old Index