From 9b2cce236fa7dac594d1337b9b83bc88debf1871 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 2 Mar 2010 21:20:22 +0000 Subject: [PATCH] - 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) --- CHANGES | 5 +++++ RELEASE-NOTES | 3 ++- lib/transfer.c | 17 +++++++++++++---- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index cac0852..12ba9b5 100644 --- 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. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 684df8e..4a6b353 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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) diff --git a/lib/transfer.c b/lib/transfer.c index 2bfcb17..ced43d4 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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 */ -- 2.7.4