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:

committed by
Daniel Stenberg

parent
ed77fdf389
commit
a607f8a20c
@@ -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:
|
||||
|
Reference in New Issue
Block a user