Re: [PATCH v2 1/4] run-command: add new check_command helper
From: Johannes Sixt <hidden>
Date: 2016-06-15 22:56:37
Subsystem:
the rest · Maintainer:
Linus Torvalds
Am 02.04.2013 12:31, schrieb Felipe Contreras:
And persistent_waitpid() to recover the information from the last run.
I'm not a fan of this new API, because it looks like a workaround for a problem that should have been solved in a cleaner way. But if we can't avoid it, please also add a paragraph to Documentation/technical/api-run-command.txt
quoted hunk ↗ jump to hunk
+int check_command(struct child_process *cmd) +{ + int status; + pid_t waiting; + + if (cmd->last_status.valid) + return 0; + + while ((waiting = waitpid(cmd->pid, &status, WNOHANG)) < 0 && errno == EINTR) + ; /* nothing */ + + if (!waiting) + return 1; + + if (waiting == cmd->pid) { + cmd->last_status.valid = 1; + cmd->last_status.status = status; + return 0; + } + + if (waiting > 0) + die("BUG: waitpid reported a random pid?"); + + return 0; +} + static void prepare_run_command_v_opt(struct child_process *cmd, const char **argv, int opt)@@ -729,7 +770,7 @@ error: int finish_async(struct async *async) { #ifdef NO_PTHREADS - return wait_or_whine(async->pid, "child process"); + return wait_or_whine(cmd, async->pid, "child process");
This breaks the NO_PTHREADS build because cmd is undeclared. Perhaps this on top:
diff --git a/run-command.c b/run-command.c
index a9fa779..a02ef62 100644
--- a/run-command.c
+++ b/run-command.c@@ -230,7 +230,7 @@ static pid_t persistent_waitpid(struct child_process *cmd, pid_t pid, int *statu { pid_t waiting; - if (cmd->last_status.valid) { + if (cmd && cmd->last_status.valid) { *status = cmd->last_status.status; return pid; }
@@ -771,7 +771,7 @@ int start_async(struct async *async) int finish_async(struct async *async) { #ifdef NO_PTHREADS - return wait_or_whine(cmd, async->pid, "child process"); + return wait_or_whine(NULL, async->pid, "child process"); #else void *ret = (void *)(intptr_t)(-1);