diff options
-rw-r--r-- | lib/multi.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/multi.c b/lib/multi.c index 12c6a344b..25efce154 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2106,6 +2106,11 @@ static CURLMcode add_next_timeout(struct timeval now, return CURLM_OK; } +#ifdef WIN32 +#define TIMEOUT_INACCURACY 40000 +#else +#define TIMEOUT_INACCURACY 3000 +#endif static CURLMcode multi_socket(struct Curl_multi *multi, bool checkall, @@ -2195,8 +2200,25 @@ static CURLMcode multi_socket(struct Curl_multi *multi, } } - now.tv_usec += 40000; /* compensate for bad precision timers that might've - triggered too early */ + /* Compensate for bad precision timers that might've triggered too early. + + This precaution was added in commit 2c72732ebf3da5e as a result of bad + resolution in the windows function use(d). + + The problematic case here is when using the multi_socket API and libcurl + has told the application about a timeout, and that timeout is what fires + off a bit early. As we don't have any IDs associated with the timeout we + can't tell which timeout that fired off but we only have the times to use + to check what to do. If it fires off too early, we don't run the correct + actions and we don't tell the application again about the same timeout as + was already first in the queue... + + Originally we made the timeouts run 40 milliseconds early on all systems, + but now we have an #ifdef setup to provide a decent precaution inaccuracy + margin. + */ + + now.tv_usec += TIMEOUT_INACCURACY; if(now.tv_usec >= 1000000) { now.tv_sec++; now.tv_usec -= 1000000; |