diff options
author | Daniel Stenberg <daniel@haxx.se> | 2008-12-19 22:58:22 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2008-12-19 22:58:22 +0000 |
commit | ffd08df863b13ac8ca276e5d6f0a74ed28b55423 (patch) | |
tree | 05d80316cc8ee56fe5710fab53d60fd46d3c3b41 /lib | |
parent | 460459e8db2fd1ef4c60a9bd51c4a5083e5b8471 (diff) |
- curl_multi_timeout() could return a timeout value of 0 even though nothing
was actually ready to get done, as the internal time resolution is higher
than the returned millisecond timer. Therefore it could cause applications
running on fast processors to do short bursts of busy-loops.
curl_multi_timeout() will now only return 0 if the timeout is actually
alreay triggered.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/multi.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/multi.c b/lib/multi.c index f17b33377..97efc7066 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1541,6 +1541,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles) if( CURLM_OK >= returncode ) update_timer(multi); + return returncode; } @@ -1951,9 +1952,19 @@ static CURLMcode multi_timeout(struct Curl_multi *multi, /* splay the lowest to the bottom */ multi->timetree = Curl_splay(tv_zero, multi->timetree); - if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) + if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) { /* some time left before expiration */ *timeout_ms = curlx_tvdiff(multi->timetree->key, now); + if(!*timeout_ms) + /* + * Since we only provide millisecond resolution on the returned value + * and the diff might be less than one millisecond here, we don't + * return zero as that may cause short bursts of busyloops on fast + * processors while the diff is still present but less than one + * millisecond! instead we return 1 until the time is ripe. + */ + *timeout_ms=1; + } else /* 0 means immediately */ *timeout_ms = 0; |