diff options
author | Johannes Sixt <johannes.sixt@telecom.at> | 2007-10-19 21:48:01 +0200 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2007-10-21 01:30:41 -0400 |
commit | 088fab5fc48ebb8b476c3b32dd25df3aa4236f94 (patch) | |
tree | 83d469cce01de3986b4e48dd82867cd88c9f3afe /builtin-fetch-pack.c | |
parent | Add infrastructure to run a function asynchronously. (diff) | |
download | tgif-088fab5fc48ebb8b476c3b32dd25df3aa4236f94.tar.xz |
Use the asyncronous function infrastructure in builtin-fetch-pack.c.
We run the sideband demultiplexer in an asynchronous function.
Note that earlier there was a check in the child process that closed
xd[1] only if it was different from xd[0]; this test is no longer needed
because git_connect() always returns two different file descriptors
(see ec587fde0a76780931c7ac32474c8c000aa45134).
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'builtin-fetch-pack.c')
-rw-r--r-- | builtin-fetch-pack.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/builtin-fetch-pack.c b/builtin-fetch-pack.c index 871b7042e7..51d8a32791 100644 --- a/builtin-fetch-pack.c +++ b/builtin-fetch-pack.c @@ -457,42 +457,37 @@ static int everything_local(struct ref **refs, int nr_match, char **match) return retval; } -static pid_t setup_sideband(int fd[2], int xd[2]) +static int sideband_demux(int fd, void *data) { - pid_t side_pid; + int *xd = data; + close(xd[1]); + return recv_sideband("fetch-pack", xd[0], fd, 2); +} + +static void setup_sideband(int fd[2], int xd[2], struct async *demux) +{ if (!use_sideband) { fd[0] = xd[0]; fd[1] = xd[1]; - return 0; + return; } /* xd[] is talking with upload-pack; subprocess reads from * xd[0], spits out band#2 to stderr, and feeds us band#1 - * through our fd[0]. + * through demux->out. */ - if (pipe(fd) < 0) - die("fetch-pack: unable to set up pipe"); - side_pid = fork(); - if (side_pid < 0) + demux->proc = sideband_demux; + demux->data = xd; + if (start_async(demux)) die("fetch-pack: unable to fork off sideband demultiplexer"); - if (!side_pid) { - /* subprocess */ - close(fd[0]); - if (xd[0] != xd[1]) - close(xd[1]); - if (recv_sideband("fetch-pack", xd[0], fd[1], 2)) - exit(1); - exit(0); - } close(xd[0]); - close(fd[1]); + fd[0] = demux->out; fd[1] = xd[1]; - return side_pid; } static int get_pack(int xd[2], char **pack_lockfile) { - pid_t side_pid; + struct async demux; int fd[2]; const char *argv[20]; char keep_arg[256]; @@ -501,7 +496,7 @@ static int get_pack(int xd[2], char **pack_lockfile) int do_keep = args.keep_pack; struct child_process cmd; - side_pid = setup_sideband(fd, xd); + setup_sideband(fd, xd, &demux); memset(&cmd, 0, sizeof(cmd)); cmd.argv = argv; @@ -556,6 +551,8 @@ static int get_pack(int xd[2], char **pack_lockfile) if (finish_command(&cmd)) die("%s failed", argv[0]); + if (use_sideband && finish_async(&demux)) + die("error in sideband demultiplexer"); return 0; } |