On 11/19/2014 7:45 AM, Daniel Stenberg wrote:
On Mon, 17 Nov 2014, Ray Satiro wrote:
The multi examples other than multi-single don't follow the
documented cleanup order [1].
It would of course be nice to get them to use the proper order as
well. The order is more a SHOULD than MUST though and libcurl really
should handle basically whatever order the app uses.
Ok. I'll change it in the ones I've touched so far.
assuming it is acceptable to continue looping after select error
But is it? I think that's the question and I really can't give a good
answer to it. If it fails on select() once, why would calling
curl_multi_fdset again give anything different and given the same
input surely a second invoke of select() will fail the same way again?
I don't know. Is it ever possible that curl_multi_fdset returns a valid
fd and in the window of time it takes before select is called something
invalidates the fd or an error occurs and then EBADF from select? Then
if curl_multi_perform and curl_multi_fdset again the bad fd is purged
and select works?
why not call curl_multi_perform() again to update the number of
running handles as is done in the case of select() success. Then the
loop will break if there are no running handles (!still_running) or
continue if there are.
I think because if select() continues to return -1, it'll effectively
become a busyloop eating 100% CPU.
Assuming it continues to return -1. This goes to what I said above, if
there is anything happening behind the scenes and if after select fails
curl_multi_perform and curl_multi_fdset are going to get updated
information.
But if select() error should be considered hard then why not set
still_running = 0 in all multi examples?
Leaning back and forth on this matter, I think I now favor treating it
as a hard error. I can't think of any legitimate reason why it would
be allowed to return -1 and have things continue.
Can you?
Other than EINTR and the possible case I mentioned above, no. If those
aren't issues how about I make them all this:
/* Handle EINTR here, if you need to. */
fprintf("select() failed, errno %d.\n", errno);
still_running = 0;
break;
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html