From: Jeff King <peff@peff.net>
To: Felipe Contreras <felipe.contreras@gmail.com>
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 19:23:26 -0400 [thread overview]
Message-ID: <20130401232326.GA30935@sigill.intra.peff.net> (raw)
In-Reply-To: <1364852804-31875-2-git-send-email-felipe.contreras@gmail.com>
On Mon, Apr 01, 2013 at 03:46:41PM -0600, Felipe Contreras wrote:
> And persistent_waitpid() to recover the information from the last run.
>
> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
A little background would be nice here...what problem are we solving?
> -static int wait_or_whine(pid_t pid, const char *argv0)
> +static pid_t persistent_waitpid(struct child_process *cmd, pid_t pid, int *stat_loc)
> +{
> + if (cmd->last_wait.code) {
> + errno = cmd->last_wait.failed_errno;
> + *stat_loc = cmd->last_wait.status;
> + return errno ? -1 : pid;
> + } else {
> + pid_t waiting;
> + while ((waiting = waitpid(pid, stat_loc, 0)) < 0 && errno == EINTR)
> + ; /* nothing */
> + return waiting;
> + }
> +}
So it looks we are trying to save the waitpid state from a previous run
and use the saved value. Otherwise, waitpid as normal.
We loop on EINTR when we actually call waitpid(). But we don't check
whether the saved errno is waitpid. What happens if we EINTR during the
saved call to waitpid?
> +static int wait_or_whine(struct child_process *cmd, pid_t pid, const char *argv0)
> {
> int status, code = -1;
> pid_t waiting;
> int failed_errno = 0;
>
> - while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR)
> - ; /* nothing */
> + waiting = persistent_waitpid(cmd, pid, &status);
>
> if (waiting < 0) {
> failed_errno = errno;
We now take argv0 into wait_or_whine. But I don't see it being used.
What's it for?
> +int check_command(struct child_process *cmd)
> +{
> + int status;
> + pid_t waiting;
> + int failed_errno = 0;
> +
> + waiting = waitpid(cmd->pid, &status, WNOHANG);
This might return the pid if it has died, -1 if there was an error, or 0
if the process still exists but hasn't died. So...
> + if (waiting != cmd->pid)
> + return 1;
> +
> + if (waiting < 0)
> + failed_errno = errno;
How would we ever trigger this second conditional? It makes sense to
return 1 when "waiting == 0", as that is saying "yes, your process is
still running" (though documenting the return either at the top of the
function or in the commit message would be helpful)
But if we get an error from waitpid, we would also return 1, which
doesn't make sense (especially if it is something like EINTR -- I don't
know offhand if we can get EINTR during WNOHANG. It should not block,
but I don't know if it can race with a signal).
> + 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, failed_errno is
always 0. We do correctly record the status. Why is code set to -1? It
seems to be used as a flag to say "this structure is valid". Should it
be defined as "unsigned valid:1;" instead?
-Peff
next prev parent reply other threads:[~2013-04-01 23:23 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 [this message]
2013-04-01 23:58 ` Felipe Contreras
2013-04-02 2:22 ` Jeff King
2013-04-02 5:11 ` Felipe Contreras
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=20130401232326.GA30935@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=aaron@schrab.com \
--cc=b@rr-dav.id.au \
--cc=drizzd@aon.at \
--cc=felipe.contreras@gmail.com \
--cc=florian.achleitner.2.6.31@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
/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).