summaryrefslogtreecommitdiff
path: root/wrapper.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-01-12 15:16:54 -0800
committerJunio C Hamano <gitster@pobox.com>2016-01-12 15:16:54 -0800
commit187c0d3d9e63f7d84d7055372f07bedb52849f06 (patch)
tree18a498fa6c6e77288756cde5dfb3a84ed7bd4062 /wrapper.c
parent7b9d1b9556b31fe5f661caa1e82856ca876f2a08 (diff)
parent62104ba14af4845c6c1ba1dab05fad4a289d806f (diff)
downloadgit-187c0d3d9e63f7d84d7055372f07bedb52849f06.tar.gz
Merge branch 'sb/submodule-parallel-fetch'
Add a framework to spawn a group of processes in parallel, and use it to run "git fetch --recurse-submodules" in parallel. Rerolled and this seems to be a lot cleaner. The merge of the earlier one to 'next' has been reverted. * sb/submodule-parallel-fetch: submodules: allow parallel fetching, add tests and documentation fetch_populated_submodules: use new parallel job processing run-command: add an asynchronous parallel child processor sigchain: add command to pop all common signals strbuf: add strbuf_read_once to read without blocking xread: poll on non blocking fds submodule.c: write "Fetching submodule <foo>" to stderr
Diffstat (limited to 'wrapper.c')
-rw-r--r--wrapper.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/wrapper.c b/wrapper.c
index c95e2906b8..b43d437630 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -236,8 +236,24 @@ ssize_t xread(int fd, void *buf, size_t len)
len = MAX_IO_SIZE;
while (1) {
nr = read(fd, buf, len);
- if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
- continue;
+ if (nr < 0) {
+ if (errno == EINTR)
+ continue;
+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ struct pollfd pfd;
+ pfd.events = POLLIN;
+ pfd.fd = fd;
+ /*
+ * it is OK if this poll() failed; we
+ * want to leave this infinite loop
+ * only when read() returns with
+ * success, or an expected failure,
+ * which would be checked by the next
+ * call to read(2).
+ */
+ poll(&pfd, 1, -1);
+ }
+ }
return nr;
}
}