- Based on patch provided by Jacob Moshenko, the transfer logic now properly
authorDaniel Stenberg <daniel@haxx.se>
Tue, 2 Mar 2010 21:20:22 +0000 (21:20 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 2 Mar 2010 21:20:22 +0000 (21:20 +0000)
  makes sure that when using sub-second timeouts, there's no final bad 1000ms
  wait. Previously, a sub-second timeout would often make the elapsed time end
  up the time rounded up to the nearest second (e.g. 1s for 200ms timeout)

CHANGES
RELEASE-NOTES
lib/transfer.c

diff --git a/CHANGES b/CHANGES
index cac0852..12ba9b5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,11 @@
                                   Changelog
 
 Daniel Stenberg (2 Mar 2010)
+- Based on patch provided by Jacob Moshenko, the transfer logic now properly
+  makes sure that when using sub-second timeouts, there's no final bad 1000ms
+  wait. Previously, a sub-second timeout would often make the elapsed time end
+  up the time rounded up to the nearest second (e.g. 1s for 200ms timeout)
+
 - Andrei Benea filed bug report #2956698 and pointed out that the
   CURLOPT_CERTINFO feature leaked memory due to a missing OpenSSL function
   call. He provided the patch to fix it too.
index 684df8e..4a6b353 100644 (file)
@@ -26,6 +26,7 @@ This release includes the following bugfixes:
  o FTP timeouts after file transferred completely
  o skip poll() on Interix
  o CURLOPT_CERTINFO memory leak
+ o sub-second timeouts improvements
 
 This release includes the following known bugs:
 
@@ -36,6 +37,6 @@ advice from friends like these:
 
  Steven M. Schweda, Yang Tse, Jack Zhang, Tom Donovan, Martin Hager,
  Daniel Fandrich, Patrick Monnerat, Pat Ray, Wesley Miaw, Ben Greear,
- Ryan Chan, Markus Duft, Andrei Benea
+ Ryan Chan, Markus Duft, Andrei Benea, Jacob Moshenko
 
         Thanks! (and sorry if I forgot to mention someone)
index 2bfcb17..ced43d4 100644 (file)
@@ -1067,11 +1067,11 @@ CURLcode Curl_readwrite(struct connectdata *conn,
     if(k->size != -1) {
       failf(data, "Operation timed out after %ld milliseconds with %"
             FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received",
-            data->set.timeout, k->bytecount, k->size);
+            Curl_tvdiff(k->now, k->start), k->bytecount, k->size);
     } else {
       failf(data, "Operation timed out after %ld milliseconds with %"
             FORMAT_OFF_T " bytes received",
-            data->set.timeout, k->bytecount);
+            Curl_tvdiff(k->now, k->start), k->bytecount);
     }
     return CURLE_OPERATION_TIMEDOUT;
   }
@@ -1266,8 +1266,17 @@ Transfer(struct connectdata *conn)
       /* if this is the first lap and one of the file descriptors is fine
          to work with, skip the timeout */
       timeout_ms = 0;
-    else
-      timeout_ms = 1000;
+    else {
+      if(data->set.timeout) {
+        timeout_ms = data->set.timeout - Curl_tvdiff(k->now, k->start);
+        if(timeout_ms > 1000)
+          timeout_ms = 1000;
+        else if(timeout_ms < 0)
+          return CURLE_OPERATION_TIMEDOUT;
+      }
+      else
+        timeout_ms = 1000;
+    }
 
     switch (Curl_socket_ready(fd_read, fd_write, timeout_ms)) {
     case -1: /* select() error, stop reading */