From: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
To: Junio C Hamano <gitster@pobox.com>
Cc: Tony Finch <dot@dotat.at>, Bob Kagy <bobkagy@gmail.com>,
git@vger.kernel.org
Subject: [PATCH] upload-archive: fix infinite loop on Cygwin
Date: Wed, 17 Jun 2009 12:11:10 +0200 [thread overview]
Message-ID: <4A38C13E.6050800@lsrfire.ath.cx> (raw)
In-Reply-To: <4A156556.900@lsrfire.ath.cx>
On Cygwin, poll() reports POLLIN even for file descriptors that have
reached their end. This caused git upload-archive to be stuck in an
infinite loop, as it only looked at the POLLIN flag.
In addition to POLLIN, check if read() returned 0, which indicates
end-of-file, and keep looping only as long as at least one of the file
descriptors has input. This lets the following command finish on its
own when run in a git repository on Cygwin, instead of it getting stuck
after printing all file names:
$ git archive -v --remote . HEAD >/dev/null
Reported-by: Bob Kagy <bobkagy@gmail.com>
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
---
This version of the patch has been cleaned up a bit compared to the
previous one and is slightly shorter, but does the same.
builtin-upload-archive.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/builtin-upload-archive.c b/builtin-upload-archive.c
index 0206b41..c4cd1e1 100644
--- a/builtin-upload-archive.c
+++ b/builtin-upload-archive.c
@@ -80,16 +80,17 @@ static void error_clnt(const char *fmt, ...)
die("sent error to the client: %s", buf);
}
-static void process_input(int child_fd, int band)
+static ssize_t process_input(int child_fd, int band)
{
char buf[16384];
ssize_t sz = read(child_fd, buf, sizeof(buf));
if (sz < 0) {
if (errno != EAGAIN && errno != EINTR)
error_clnt("read error: %s\n", strerror(errno));
- return;
+ return sz;
}
send_sideband(1, band, buf, sz, LARGE_PACKET_MAX);
+ return sz;
}
int cmd_upload_archive(int argc, const char **argv, const char *prefix)
@@ -131,6 +132,7 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
while (1) {
struct pollfd pfd[2];
+ ssize_t processed[2] = { 0, 0 };
int status;
pfd[0].fd = fd1[0];
@@ -147,12 +149,12 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
}
if (pfd[0].revents & POLLIN)
/* Data stream ready */
- process_input(pfd[0].fd, 1);
+ processed[0] = process_input(pfd[0].fd, 1);
if (pfd[1].revents & POLLIN)
/* Status stream ready */
- process_input(pfd[1].fd, 2);
+ processed[1] = process_input(pfd[1].fd, 2);
/* Always finish to read data when available */
- if ((pfd[0].revents | pfd[1].revents) & POLLIN)
+ if (processed[0] || processed[1])
continue;
if (waitpid(writer, &status, 0) < 0)
--
1.6.3.2.307.g21cd0
next prev parent reply other threads:[~2009-06-17 10:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-18 14:37 git archive, cygwin, and --git-dir vs --remote Bob Kagy
2009-05-21 9:08 ` René Scharfe
2009-05-21 13:32 ` Tony Finch
2009-05-21 14:29 ` René Scharfe
2009-06-17 10:11 ` René Scharfe [this message]
2009-06-18 17:18 ` [PATCH] upload-archive: fix infinite loop on Cygwin Tony Finch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A38C13E.6050800@lsrfire.ath.cx \
--to=rene.scharfe@lsrfire.ath.cx \
--cc=bobkagy@gmail.com \
--cc=dot@dotat.at \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.