run-command: factor out child_process_clear()

Avoid duplication by moving the code to release allocated memory for
arguments and environment to its own function, child_process_clear().
Export it to provide a counterpart to child_process_init().

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe 2015-10-24 14:11:27 +02:00 committed by Junio C Hamano
parent a2558fb8e1
commit 2d71608ec0
3 changed files with 17 additions and 6 deletions

View File

@ -46,6 +46,13 @@ Functions
The argument dir corresponds the member .dir. The argument env The argument dir corresponds the member .dir. The argument env
corresponds to the member .env. corresponds to the member .env.
`child_process_clear`::
Release the memory associated with the struct child_process.
Most users of the run-command API don't need to call this
function explicitly because `start_command` invokes it on
failure and `finish_command` calls it automatically already.
The functions above do the following: The functions above do the following:
. If a system call failed, errno is set and -1 is returned. A diagnostic . If a system call failed, errno is set and -1 is returned. A diagnostic

View File

@ -11,6 +11,12 @@ void child_process_init(struct child_process *child)
argv_array_init(&child->env_array); argv_array_init(&child->env_array);
} }
void child_process_clear(struct child_process *child)
{
argv_array_clear(&child->args);
argv_array_clear(&child->env_array);
}
struct child_to_clean { struct child_to_clean {
pid_t pid; pid_t pid;
struct child_to_clean *next; struct child_to_clean *next;
@ -336,8 +342,7 @@ int start_command(struct child_process *cmd)
fail_pipe: fail_pipe:
error("cannot create %s pipe for %s: %s", error("cannot create %s pipe for %s: %s",
str, cmd->argv[0], strerror(failed_errno)); str, cmd->argv[0], strerror(failed_errno));
argv_array_clear(&cmd->args); child_process_clear(cmd);
argv_array_clear(&cmd->env_array);
errno = failed_errno; errno = failed_errno;
return -1; return -1;
} }
@ -523,8 +528,7 @@ fail_pipe:
close_pair(fderr); close_pair(fderr);
else if (cmd->err) else if (cmd->err)
close(cmd->err); close(cmd->err);
argv_array_clear(&cmd->args); child_process_clear(cmd);
argv_array_clear(&cmd->env_array);
errno = failed_errno; errno = failed_errno;
return -1; return -1;
} }
@ -550,8 +554,7 @@ fail_pipe:
int finish_command(struct child_process *cmd) int finish_command(struct child_process *cmd)
{ {
int ret = wait_or_whine(cmd->pid, cmd->argv[0]); int ret = wait_or_whine(cmd->pid, cmd->argv[0]);
argv_array_clear(&cmd->args); child_process_clear(cmd);
argv_array_clear(&cmd->env_array);
return ret; return ret;
} }

View File

@ -47,6 +47,7 @@ struct child_process {
#define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT } #define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT }
void child_process_init(struct child_process *); void child_process_init(struct child_process *);
void child_process_clear(struct child_process *);
int start_command(struct child_process *); int start_command(struct child_process *);
int finish_command(struct child_process *); int finish_command(struct child_process *);