]> granicus.if.org Git - curl/commitdiff
multi: add timer inaccuracy margin to timeout/connecttimeout
authorDaniel Stenberg <daniel@haxx.se>
Mon, 2 Dec 2013 14:33:32 +0000 (15:33 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 15 Dec 2013 21:53:41 +0000 (22:53 +0100)
Since all systems have inaccuracy in the timeout handling it is
imperative that we add an inaccuracy margin to the general timeout and
connecttimeout handling with the multi interface. This way, when the
timeout fires we should be fairly sure that it has passed the timeout
value and will be suitably detected.

For cases where the timeout fire before the actual timeout, we would
otherwise consume the timeout action and still not run the timeout code
since the condition wasn't met.

Reported-by: He Qin
Bug: http://curl.haxx.se/bug/view.cgi?id=1298

lib/multiif.h
lib/transfer.c

index e61c5c6f2c9fd0a80d2a7a608357d944b6dd2c16..15163da985d67889ca51d5d0bcecfa35b3bc2dbe 100644 (file)
@@ -30,6 +30,8 @@
 #define MULTI_TIMEOUT_INACCURACY 3000
 #endif
 
+#define MULTI_TIMEOUT_INACCURACY_MS (MULTI_TIMEOUT_INACCURACY / 1000)
+
 /*
  * Prototypes for library-wide functions provided by multi.c
  */
index 533e394b6bff6e6e66d1393210368c6fe3a708ee..e3194415b7bcbf7cdf7fe761ded7d8ef04c14637 100644 (file)
@@ -1309,10 +1309,11 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
     Curl_pgrsStartNow(data);
 
     if(data->set.timeout)
-      Curl_expire(data, data->set.timeout);
+      Curl_expire(data, data->set.timeout + MULTI_TIMEOUT_INACCURACY_MS);
 
     if(data->set.connecttimeout)
-      Curl_expire(data, data->set.connecttimeout);
+      Curl_expire(data, data->set.connecttimeout +
+                  MULTI_TIMEOUT_INACCURACY_MS);
 
     /* In case the handle is re-used and an authentication method was picked
        in the session we need to make sure we only use the one(s) we now