mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
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 ec587fde0a
).
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
2d22c20830
commit
088fab5fc4
1 changed files with 18 additions and 21 deletions
|
@ -457,42 +457,37 @@ static int everything_local(struct ref **refs, int nr_match, char **match)
|
||||||
return retval;
|
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) {
|
if (!use_sideband) {
|
||||||
fd[0] = xd[0];
|
fd[0] = xd[0];
|
||||||
fd[1] = xd[1];
|
fd[1] = xd[1];
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
/* xd[] is talking with upload-pack; subprocess reads from
|
/* xd[] is talking with upload-pack; subprocess reads from
|
||||||
* xd[0], spits out band#2 to stderr, and feeds us band#1
|
* xd[0], spits out band#2 to stderr, and feeds us band#1
|
||||||
* through our fd[0].
|
* through demux->out.
|
||||||
*/
|
*/
|
||||||
if (pipe(fd) < 0)
|
demux->proc = sideband_demux;
|
||||||
die("fetch-pack: unable to set up pipe");
|
demux->data = xd;
|
||||||
side_pid = fork();
|
if (start_async(demux))
|
||||||
if (side_pid < 0)
|
|
||||||
die("fetch-pack: unable to fork off sideband demultiplexer");
|
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(xd[0]);
|
||||||
close(fd[1]);
|
fd[0] = demux->out;
|
||||||
fd[1] = xd[1];
|
fd[1] = xd[1];
|
||||||
return side_pid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_pack(int xd[2], char **pack_lockfile)
|
static int get_pack(int xd[2], char **pack_lockfile)
|
||||||
{
|
{
|
||||||
pid_t side_pid;
|
struct async demux;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
const char *argv[20];
|
const char *argv[20];
|
||||||
char keep_arg[256];
|
char keep_arg[256];
|
||||||
|
@ -501,7 +496,7 @@ static int get_pack(int xd[2], char **pack_lockfile)
|
||||||
int do_keep = args.keep_pack;
|
int do_keep = args.keep_pack;
|
||||||
struct child_process cmd;
|
struct child_process cmd;
|
||||||
|
|
||||||
side_pid = setup_sideband(fd, xd);
|
setup_sideband(fd, xd, &demux);
|
||||||
|
|
||||||
memset(&cmd, 0, sizeof(cmd));
|
memset(&cmd, 0, sizeof(cmd));
|
||||||
cmd.argv = argv;
|
cmd.argv = argv;
|
||||||
|
@ -556,6 +551,8 @@ static int get_pack(int xd[2], char **pack_lockfile)
|
||||||
|
|
||||||
if (finish_command(&cmd))
|
if (finish_command(&cmd))
|
||||||
die("%s failed", argv[0]);
|
die("%s failed", argv[0]);
|
||||||
|
if (use_sideband && finish_async(&demux))
|
||||||
|
die("error in sideband demultiplexer");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue