summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMika Fischer <mika.fischer@zoopnet.de>2011-11-04 15:19:26 +0100
committerJunio C Hamano <gitster@pobox.com>2011-11-04 10:46:56 -0700
commiteb56c82163487fe07ba04f2b365a557282cbd766 (patch)
tree61d97e76d9eb7415bf1db9e29ecffe6f2c88c2ca
parent6f9dd67ffea3e86276a73e522ce1186a99bbe65d (diff)
downloadgit-eb56c82163487fe07ba04f2b365a557282cbd766.tar.gz
http.c: Use timeout suggested by curl instead of fixed 50ms timeout
Recent versions of curl can suggest a period of time the library user should sleep and try again, when curl is blocked on reading or writing (or connecting). Use this timeout instead of always sleeping for 50ms. Signed-off-by: Mika Fischer <mika.fischer@zoopnet.de> Helped-by: Daniel Stenberg <daniel@haxx.se> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--http.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/http.c b/http.c
index a815f628b9..924be52add 100644
--- a/http.c
+++ b/http.c
@@ -651,13 +651,29 @@ void run_active_slot(struct active_request_slot *slot)
}
if (slot->in_use && !data_received) {
+#if LIBCURL_VERSION_NUM >= 0x070f04
+ long curl_timeout;
+ curl_multi_timeout(curlm, &curl_timeout);
+ if (curl_timeout == 0) {
+ continue;
+ } else if (curl_timeout == -1) {
+ select_timeout.tv_sec = 0;
+ select_timeout.tv_usec = 50000;
+ } else {
+ select_timeout.tv_sec = curl_timeout / 1000;
+ select_timeout.tv_usec = (curl_timeout % 1000) * 1000;
+ }
+#else
+ select_timeout.tv_sec = 0;
+ select_timeout.tv_usec = 50000;
+#endif
+
max_fd = -1;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&excfds);
curl_multi_fdset(curlm, &readfds, &writefds, &excfds, &max_fd);
- select_timeout.tv_sec = 0;
- select_timeout.tv_usec = 50000;
+
select(max_fd+1, &readfds, &writefds, &excfds, &select_timeout);
}
}