mirror of
https://github.com/curl/curl.git
synced 2026-05-19 23:56:22 +03:00
examples: Don't call select() to sleep on windows
Windows does not support using select() for sleeping without a dummy socket. Instead use Windows' Sleep() and sleep for 100ms which is the minimum suggested value in the curl_multi_fdset() doc. Prior to this change the multi examples would exit prematurely since select() would error instead of sleeping when called without an fd. Reported-by: Johan Lantz Bug: http://curl.haxx.se/mail/lib-2014-11/0221.html
This commit is contained in:
parent
ed77fdf389
commit
a607f8a20c
9 changed files with 222 additions and 66 deletions
|
|
@ -147,6 +147,7 @@ int main(void)
|
|||
do {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
CURLMcode mc; /* curl_multi_fdset() return code */
|
||||
|
||||
fd_set fdread;
|
||||
fd_set fdwrite;
|
||||
|
|
@ -173,15 +174,31 @@ int main(void)
|
|||
}
|
||||
|
||||
/* get file descriptors from the transfers */
|
||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
|
||||
/* In a real-world program you OF COURSE check the return code of the
|
||||
function calls. On success, the value of maxfd is guaranteed to be
|
||||
greater or equal than -1. We call select(maxfd + 1, ...), specially in
|
||||
case of (maxfd == -1), we call select(0, ...), which is basically equal
|
||||
to sleep. */
|
||||
if(mc != CURLM_OK)
|
||||
{
|
||||
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
|
||||
break;
|
||||
}
|
||||
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
/* On success the value of maxfd is guaranteed to be >= -1. We call
|
||||
select(maxfd + 1, ...); specially in case of (maxfd == -1) we call
|
||||
select(0, ...), which is basically equal to sleeping the timeout. On
|
||||
Windows we can't sleep via select without a dummy socket and instead
|
||||
we Sleep() for 100ms which is the minimum suggested value in the
|
||||
curl_multi_fdset() doc. */
|
||||
|
||||
#ifdef _WIN32
|
||||
if(maxfd == -1) {
|
||||
Sleep(100);
|
||||
rc = 0;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
}
|
||||
|
||||
switch(rc) {
|
||||
case -1:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue