mirror of
https://github.com/moparisthebest/curl
synced 2024-11-15 22:15:13 -05:00
multi: skip EINTR check on wakeup socket if it was closed
- Don't check errno on wakeup socket if sread returned 0 since sread
doesn't set errno in that case.
This is a follow-up to cf7760a
from several days ago which fixed
Curl_multi_wait to stop busy looping sread on the non-blocking wakeup
socket if it was closed (ie sread returns 0). Due to a logic error it
was still possible to busy loop in that case if errno == EINTR.
Closes https://github.com/curl/curl/pull/5047
This commit is contained in:
parent
0b7735c45b
commit
2258b7bcc2
@ -1194,14 +1194,16 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
|
|||||||
if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
|
if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
|
||||||
if(ufds[curlfds + extra_nfds].revents & POLLIN) {
|
if(ufds[curlfds + extra_nfds].revents & POLLIN) {
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
ssize_t nread;
|
||||||
while(1) {
|
while(1) {
|
||||||
/* the reading socket is non-blocking, try to read
|
/* the reading socket is non-blocking, try to read
|
||||||
data from it until it receives an error (except EINTR).
|
data from it until it receives an error (except EINTR).
|
||||||
In normal cases it will get EAGAIN or EWOULDBLOCK
|
In normal cases it will get EAGAIN or EWOULDBLOCK
|
||||||
when there is no more data, breaking the loop. */
|
when there is no more data, breaking the loop. */
|
||||||
if(sread(multi->wakeup_pair[0], buf, sizeof(buf)) <= 0) {
|
nread = sread(multi->wakeup_pair[0], buf, sizeof(buf));
|
||||||
|
if(nread <= 0) {
|
||||||
#ifndef USE_WINSOCK
|
#ifndef USE_WINSOCK
|
||||||
if(EINTR == SOCKERRNO)
|
if(nread < 0 && EINTR == SOCKERRNO)
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user