summaryrefslogtreecommitdiffstats
path: root/0011-curl-7.29.0-0feeab78.patch
diff options
context:
space:
mode:
Diffstat (limited to '0011-curl-7.29.0-0feeab78.patch')
-rw-r--r--0011-curl-7.29.0-0feeab78.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/0011-curl-7.29.0-0feeab78.patch b/0011-curl-7.29.0-0feeab78.patch
new file mode 100644
index 0000000..bd6b8b3
--- /dev/null
+++ b/0011-curl-7.29.0-0feeab78.patch
@@ -0,0 +1,74 @@
+From d3036f34cce421990e8268ee4bbfc0d9f5ceb054 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel@haxx.se>
+Date: Thu, 13 Jun 2013 19:27:12 +0200
+Subject: [PATCH] curl_easy_perform: avoid busy-looping
+
+When curl_multi_wait() finds no file descriptor to wait for, it returns
+instantly and this must be handled gracefully within curl_easy_perform()
+or cause a busy-loop. Starting now, repeated fast returns without any
+file descriptors is detected and a gradually increasing sleep will be
+used (up to a max of 1000 milliseconds) before continuing the loop.
+
+Bug: http://curl.haxx.se/bug/view.cgi?id=1238
+Reported-by: Miguel Angel
+
+[upstream commit 0feeab7802dd2a6465d22d153d8d36b2cca99b96]
+
+Signed-off-by: Kamil Dudka <kdudka@redhat.com>
+---
+ lib/easy.c | 25 +++++++++++++++++++++++++
+ 1 files changed, 25 insertions(+), 0 deletions(-)
+
+diff --git a/lib/easy.c b/lib/easy.c
+index 2739598..a7051dd 100644
+--- a/lib/easy.c
++++ b/lib/easy.c
+@@ -410,6 +410,9 @@ CURLcode curl_easy_perform(CURL *easy)
+ bool done = FALSE;
+ int rc;
+ struct SessionHandle *data = easy;
++ int without_fds = 0; /* count number of consecutive returns from
++ curl_multi_wait() without any filedescriptors */
++ struct timeval before;
+
+ if(!easy)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+@@ -445,6 +448,7 @@ CURLcode curl_easy_perform(CURL *easy)
+ int still_running;
+ int ret;
+
++ before = curlx_tvnow();
+ mcode = curl_multi_wait(multi, NULL, 0, 1000, &ret);
+
+ if(mcode == CURLM_OK) {
+@@ -453,6 +457,27 @@ CURLcode curl_easy_perform(CURL *easy)
+ code = CURLE_RECV_ERROR;
+ break;
+ }
++ else if(ret == 0) {
++ struct timeval after = curlx_tvnow();
++ /* If it returns without any filedescriptor instantly, we need to
++ avoid busy-looping during periods where it has nothing particular
++ to wait for */
++ if(curlx_tvdiff(after, before) <= 10) {
++ without_fds++;
++ if(without_fds > 2) {
++ int sleep_ms = without_fds * 50;
++ if(sleep_ms > 1000)
++ sleep_ms = 1000;
++ Curl_wait_ms(sleep_ms);
++ }
++ }
++ else
++ /* it wasn't "instant", restart counter */
++ without_fds = 0;
++ }
++ else
++ /* got file descriptor, restart counter */
++ without_fds = 0;
+
+ mcode = curl_multi_perform(multi, &still_running);
+ }
+--
+1.7.1
+