curl_multi_wait: no wait if no descriptors to wait for

This is a minor change in behavior after having been pointed out by Mark
Tully and discussed on the list. Initially this case would internally
call poll() with no sockets and a timeout which would equal a sleep for
that specified time.

Bug: http://curl.haxx.se/mail/lib-2012-10/0076.html
Reported by: Mark Tully
This commit is contained in:
Daniel Stenberg 2012-10-09 22:19:49 +02:00
parent 3644a35027
commit 8373ca3641
2 changed files with 10 additions and 3 deletions

View File

@ -43,6 +43,9 @@ similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
On completion, if \fInumfds\fP is supplied, it will be populated with the On completion, if \fInumfds\fP is supplied, it will be populated with the
number of file descriptors on which interesting events occured. number of file descriptors on which interesting events occured.
If no extra file descriptors are provided and libcurl has no file descriptor
to offer to wait for, this function will return immediately.
This function is encouraged to be used instead of select(3) when using the This function is encouraged to be used instead of select(3) when using the
multi interface to allow applications to easier circumvent the common problem multi interface to allow applications to easier circumvent the common problem
with 1024 maximum file descriptors. with 1024 maximum file descriptors.
@ -67,6 +70,6 @@ events such as the socket being clear to write without blocking.
CURLMcode type, general libcurl multi interface error code. See CURLMcode type, general libcurl multi interface error code. See
\fIlibcurl-errors(3)\fP \fIlibcurl-errors(3)\fP
.SH AVAILABILITY .SH AVAILABILITY
This function was added in libcurl 7.28.0 This function was added in libcurl 7.28.0.
.SH "SEE ALSO" .SH "SEE ALSO"
.BR curl_multi_fdset "(3), " curl_multi_perform "(3)" .BR curl_multi_fdset "(3), " curl_multi_perform "(3)"

View File

@ -1024,8 +1024,12 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
++nfds; ++nfds;
} }
/* wait... */ if(nfds)
i = Curl_poll(ufds, nfds, timeout_ms); /* wait... */
i = Curl_poll(ufds, nfds, timeout_ms);
else
i = 0;
free(ufds); free(ufds);
if(ret) if(ret)
*ret = i; *ret = i;