From: Felipe Contreras <felipe.contreras@gmail.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Johannes Sixt <j6t@kdbg.org>, Aaron Schrab <aaron@schrab.com>,
Clemens Buchacher <drizzd@aon.at>,
David Michael Barr <b@rr-dav.id.au>,
Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
Subject: Re: [PATCH 1/4] run-command: add new check_command helper
Date: Mon, 1 Apr 2013 23:11:20 -0600 [thread overview]
Message-ID: <CAMP44s3-DnBM7Tm_+igLN+c5MGrbJNXUBwcj1HvGCPEJEwJSBQ@mail.gmail.com> (raw)
In-Reply-To: <20130402022214.GA719@sigill.intra.peff.net>
On Mon, Apr 1, 2013 at 8:22 PM, Jeff King <peff@peff.net> wrote:
> On Mon, Apr 01, 2013 at 05:58:55PM -0600, Felipe Contreras wrote:
>> Are you saying that even if we have stored the result of a waitpid
>> command, if errno is EINTR, then we should still loop waitpid()? If
>> so, I guess this would do the trick:
>
> Yes, I think that would work. Though I wonder if it is even worth
> storing EINTR at all in the first place. It tells us nothing. In fact,
> does storing any error condition really tell us anything?
Probably not, I just tried to minimize the potential behavior changes.
> The two states
> we are interested in at this point are:
>
> 1. We have reaped the child via waitpid; here is its status.
>
> 2. We have not (either we did not try, it was not dead yet, or we were
> not able to due to an error). We should now try it again.
>
> If we got EINTR the first time around, we would likely get the "real"
> answer this time. If we get anything else (like EINVAL or ECHILD), then
> we would get the same thing again calling waitpid() later.
>
>> > We now take argv0 into wait_or_whine. But I don't see it being used.
>> > What's it for?
>>
>> It was there before:
>> -static int wait_or_whine(pid_t pid, const char *argv0)
>> +static int wait_or_whine(struct child_process *cmd, pid_t pid, const
>> char *argv0)
>
> Ah, sorry, I misread the diff. We are adding "cmd", not "argv0".
Yeah, which in fact was already there before.
> That would trigger the rest of your code in the error case, which I
> think was your original intent. But then we return "0" from
> check_command. Is that right?
>
> There are three states we can be in from calling waitpid:
>
> 1. The process is dead.
>
> 2. The process is not dead.
>
> 3. We could not determine which because waitpid returned an error.
>
> It is clear that check_command is trying to tell its caller (1) or (2);
> but what should it say in case of (3)?
>
> Naively, given how patch 2 uses it, I think it would actually make sense
> for it to return 1. That is, the semantics are "return 0 if and only if
> the pid is verified to be dead; otherwise return 1".
I thought if there was an error that constituted a failure.
> But if we know from reading waitpid(3) that waitpid should only fail due
> to EINTR, or due to bogus arguments (e.g., a pid that does not exist or
> has already been reaped), then maybe something like this makes sense:
>
> while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR)
> ; /* nothing */
But we don't want to wait synchronously here, we just want to ping.
> /* pid definitely still going */
> if (!waiting)
> return 1;
>
> /* pid definitely died */
> if (waiting == cmd->pid) {
> cmd->last_status.valid = 1;
> cmd->last_status.status = status;
> return 0;
> }
>
> /*
> * this should never happen, since we handed waitpid() a single
> * pid, so it should either return that pid, 0, or an error.
> */
> if (waiting > 0)
> die("BUG: waitpid reported a random pid?");
>
> /*
> * otherwise, we have an error. Assume the pid is gone, since that
> * is the only reason for waitpid to report a problem besides EINTR.
> * We don't bother recording errno, since we can just repeat
> * the waitpid again later.
> */
> return 0;
The rest makes sense.
>> >> + cmd->last_wait.code = -1;
>> >> + cmd->last_wait.failed_errno = failed_errno;
>> >> + cmd->last_wait.status = status;
>> >
>> > Since we can only get here when waiting == cmd->pid,
>>
>> No, also when waiting < 0.
>
> After the fix above, yes; in the original we would always have exited
> already.
No:
+ if (waiting != cmd->pid)
+ return 1;
If waiting < 0, waiting != cmd->pid, and therefore this return is not
triggered, and there's only one more return at the end of the
function.
Cheers.
--
Felipe Contreras
next prev parent reply other threads:[~2013-04-02 5:11 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-01 21:46 [PATCH 0/4] run-command: new check_command helper Felipe Contreras
2013-04-01 21:46 ` [PATCH 1/4] run-command: add " Felipe Contreras
2013-04-01 23:23 ` Jeff King
2013-04-01 23:58 ` Felipe Contreras
2013-04-02 2:22 ` Jeff King
2013-04-02 5:11 ` Felipe Contreras [this message]
2013-04-02 5:14 ` Jeff King
2013-04-02 5:22 ` Felipe Contreras
2013-04-02 5:26 ` Jeff King
2013-04-01 21:46 ` [PATCH 2/4] transport-helper: check if remote helper is alive Felipe Contreras
2013-04-01 23:33 ` Jeff King
2013-04-02 0:12 ` Felipe Contreras
2013-04-02 2:30 ` Jeff King
2013-04-02 4:51 ` Felipe Contreras
2013-04-02 5:01 ` Jeff King
2013-04-02 5:19 ` Felipe Contreras
2013-04-02 9:36 ` Felipe Contreras
2013-04-02 0:26 ` Junio C Hamano
2013-04-02 4:58 ` Felipe Contreras
2013-04-01 21:46 ` [PATCH 3/4] tmp: remote-helper: add timers to catch errors Felipe Contreras
2013-04-01 21:46 ` [PATCH 4/4] tmp: run-command: code to exercise check_command Felipe Contreras
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAMP44s3-DnBM7Tm_+igLN+c5MGrbJNXUBwcj1HvGCPEJEwJSBQ@mail.gmail.com \
--to=felipe.contreras@gmail.com \
--cc=aaron@schrab.com \
--cc=b@rr-dav.id.au \
--cc=drizzd@aon.at \
--cc=florian.achleitner.2.6.31@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).