diff options
author | Jay Satiro <raysatiro@yahoo.com> | 2014-11-14 03:59:46 -0500 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-11-15 21:27:20 +0100 |
commit | a607f8a20c6c5ac869598753097e3da06165cbd9 (patch) | |
tree | 69622fb06a0fc0774a01bed41c3353bed01d2a13 /docs/examples/pop3-multi.c | |
parent | ed77fdf389cb5a45bc7465a6d08955c7edd3a6cd (diff) | |
download | curl-a607f8a20c6c5ac869598753097e3da06165cbd9.tar.gz |
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
Diffstat (limited to 'docs/examples/pop3-multi.c')
-rw-r--r-- | docs/examples/pop3-multi.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/docs/examples/pop3-multi.c b/docs/examples/pop3-multi.c index d14d1159b..42142f954 100644 --- a/docs/examples/pop3-multi.c +++ b/docs/examples/pop3-multi.c @@ -88,6 +88,7 @@ int main(void) fd_set fdexcep; int maxfd = -1; int rc; + CURLMcode mc; /* curl_multi_fdset() return code */ long curl_timeo = -1; @@ -109,15 +110,32 @@ int main(void) timeout.tv_usec = (curl_timeo % 1000) * 1000; } - /* Get file descriptors from the transfers */ - curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd); + /* get file descriptors from the transfers */ + mc = curl_multi_fdset(mcurl, &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. */ - rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); + if(mc != CURLM_OK) + { + fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc); + break; + } + + /* 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); + } if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) { fprintf(stderr, |