mirror of
https://github.com/curl/curl.git
synced 2026-07-22 23:37:17 +03:00
multi: use a pipe instead of a socketpair on apple platforms
Sockets may be shut down by the kernel when the app is moved to the background, but pipes are not. Removed from KNOWN_BUGS Fixes #6132 Closes #9368
This commit is contained in:
parent
89d204036a
commit
07f80f968d
2 changed files with 23 additions and 20 deletions
30
lib/multi.c
30
lib/multi.c
|
|
@ -55,6 +55,22 @@
|
|||
#include "curl_memory.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
#define wakeup_write write
|
||||
#define wakeup_read read
|
||||
#define wakeup_close close
|
||||
#define wakeup_create pipe
|
||||
|
||||
#else /* __APPLE__ */
|
||||
|
||||
#define wakeup_write swrite
|
||||
#define wakeup_read sread
|
||||
#define wakeup_close sclose
|
||||
#define wakeup_create(p) Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, p)
|
||||
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
CURL_SOCKET_HASH_TABLE_SIZE should be a prime number. Increasing it from 97
|
||||
to 911 takes on a 32-bit machine 4 x 804 = 3211 more bytes. Still, every
|
||||
|
|
@ -404,14 +420,14 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
|
|||
goto error;
|
||||
#else
|
||||
#ifdef ENABLE_WAKEUP
|
||||
if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) {
|
||||
if(wakeup_create(multi->wakeup_pair) < 0) {
|
||||
multi->wakeup_pair[0] = CURL_SOCKET_BAD;
|
||||
multi->wakeup_pair[1] = CURL_SOCKET_BAD;
|
||||
}
|
||||
else if(curlx_nonblock(multi->wakeup_pair[0], TRUE) < 0 ||
|
||||
curlx_nonblock(multi->wakeup_pair[1], TRUE) < 0) {
|
||||
sclose(multi->wakeup_pair[0]);
|
||||
sclose(multi->wakeup_pair[1]);
|
||||
wakeup_close(multi->wakeup_pair[0]);
|
||||
wakeup_close(multi->wakeup_pair[1]);
|
||||
multi->wakeup_pair[0] = CURL_SOCKET_BAD;
|
||||
multi->wakeup_pair[1] = CURL_SOCKET_BAD;
|
||||
}
|
||||
|
|
@ -1413,7 +1429,7 @@ static CURLMcode multi_wait(struct Curl_multi *multi,
|
|||
data from it until it receives an error (except EINTR).
|
||||
In normal cases it will get EAGAIN or EWOULDBLOCK
|
||||
when there is no more data, breaking the loop. */
|
||||
nread = sread(multi->wakeup_pair[0], buf, sizeof(buf));
|
||||
nread = wakeup_read(multi->wakeup_pair[0], buf, sizeof(buf));
|
||||
if(nread <= 0) {
|
||||
if(nread < 0 && EINTR == SOCKERRNO)
|
||||
continue;
|
||||
|
|
@ -1506,7 +1522,7 @@ CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
|
|||
that will call curl_multi_wait(). If swrite() returns that it
|
||||
would block, it's considered successful because it means that
|
||||
previous calls to this function will wake up the poll(). */
|
||||
if(swrite(multi->wakeup_pair[1], buf, sizeof(buf)) < 0) {
|
||||
if(wakeup_write(multi->wakeup_pair[1], buf, sizeof(buf)) < 0) {
|
||||
int err = SOCKERRNO;
|
||||
int return_success;
|
||||
#ifdef USE_WINSOCK
|
||||
|
|
@ -2742,8 +2758,8 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
|
|||
WSACloseEvent(multi->wsa_event);
|
||||
#else
|
||||
#ifdef ENABLE_WAKEUP
|
||||
sclose(multi->wakeup_pair[0]);
|
||||
sclose(multi->wakeup_pair[1]);
|
||||
wakeup_close(multi->wakeup_pair[0]);
|
||||
wakeup_close(multi->wakeup_pair[1]);
|
||||
#endif
|
||||
#endif
|
||||
free(multi);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue