Skip to content

Commit

Permalink
- curl_multi_timeout() could return a timeout value of 0 even though …
Browse files Browse the repository at this point in the history
…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.
  • Loading branch information
bagder committed Dec 19, 2008
1 parent 460459e commit ffd08df
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
7 changes: 7 additions & 0 deletions CHANGES
Expand Up @@ -7,6 +7,13 @@
Changelog

Daniel Stenberg (19 Dec 2008)
- 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.

- Using the libssh2 0.19 function libssh2_session_block_directions(), libcurl
now has an improved ability to do right when the multi interface (both
"regular" and multi_socket) is used for SCP and SFTP transfers. This should
Expand Down
2 changes: 2 additions & 0 deletions RELEASE-NOTES
Expand Up @@ -34,6 +34,8 @@ This release includes the following bugfixes:
o improved connection re-use for subsequent SCP and SFTP transfers
o multi interface does less busy-loops for SCP and SFTP transfers with libssh2
0.19 or later
o curl_multi_timeout() no longer returns timeout 0 when there's nothing to do
yet

This release includes the following known bugs:

Expand Down
13 changes: 12 additions & 1 deletion lib/multi.c
Expand Up @@ -1541,6 +1541,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)

if( CURLM_OK >= returncode )
update_timer(multi);

return returncode;
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ffd08df

Please sign in to comment.