asyn-thread: use pipe instead of socketpair for IPC when available

If pipe() is present. Less overhead.

Helped-by: Viktor Szakats
Closes #12146
This commit is contained in:
Daniel Stenberg 2023-10-17 17:56:09 +02:00
parent 64936919b9
commit 43eb798da0
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 22 additions and 21 deletions

View File

@ -196,7 +196,7 @@ void destroy_thread_sync_data(struct thread_sync_data *tsd)
* the other end (for reading) is always closed in the parent thread. * the other end (for reading) is always closed in the parent thread.
*/ */
if(tsd->sock_pair[1] != CURL_SOCKET_BAD) { if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
sclose(tsd->sock_pair[1]); wakeup_close(tsd->sock_pair[1]);
} }
#endif #endif
memset(tsd, 0, sizeof(*tsd)); memset(tsd, 0, sizeof(*tsd));
@ -233,8 +233,8 @@ int init_thread_sync_data(struct thread_data *td,
Curl_mutex_init(tsd->mtx); Curl_mutex_init(tsd->mtx);
#ifndef CURL_DISABLE_SOCKETPAIR #ifndef CURL_DISABLE_SOCKETPAIR
/* create socket pair, avoid AF_LOCAL since it doesn't build on Solaris */ /* create socket pair or pipe */
if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) { if(wakeup_create(&tsd->sock_pair[0]) < 0) {
tsd->sock_pair[0] = CURL_SOCKET_BAD; tsd->sock_pair[0] = CURL_SOCKET_BAD;
tsd->sock_pair[1] = CURL_SOCKET_BAD; tsd->sock_pair[1] = CURL_SOCKET_BAD;
goto err_exit; goto err_exit;
@ -254,7 +254,7 @@ int init_thread_sync_data(struct thread_data *td,
err_exit: err_exit:
#ifndef CURL_DISABLE_SOCKETPAIR #ifndef CURL_DISABLE_SOCKETPAIR
if(tsd->sock_pair[0] != CURL_SOCKET_BAD) { if(tsd->sock_pair[0] != CURL_SOCKET_BAD) {
sclose(tsd->sock_pair[0]); wakeup_close(tsd->sock_pair[0]);
tsd->sock_pair[0] = CURL_SOCKET_BAD; tsd->sock_pair[0] = CURL_SOCKET_BAD;
} }
#endif #endif
@ -320,7 +320,7 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
if(tsd->sock_pair[1] != CURL_SOCKET_BAD) { if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
/* DNS has been resolved, signal client task */ /* DNS has been resolved, signal client task */
buf[0] = 1; buf[0] = 1;
if(swrite(tsd->sock_pair[1], buf, sizeof(buf)) < 0) { if(wakeup_write(tsd->sock_pair[1], buf, sizeof(buf)) < 0) {
/* update sock_erro to errno */ /* update sock_erro to errno */
tsd->sock_error = SOCKERRNO; tsd->sock_error = SOCKERRNO;
} }

View File

@ -55,22 +55,6 @@
#include "curl_memory.h" #include "curl_memory.h"
#include "memdebug.h" #include "memdebug.h"
#ifdef HAVE_PIPE
#define wakeup_write write
#define wakeup_read read
#define wakeup_close close
#define wakeup_create pipe
#else /* HAVE_PIPE */
#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 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 to 911 takes on a 32-bit machine 4 x 804 = 3211 more bytes. Still, every

View File

@ -25,6 +25,23 @@
***************************************************************************/ ***************************************************************************/
#include "curl_setup.h" #include "curl_setup.h"
#ifdef HAVE_PIPE
#define wakeup_write write
#define wakeup_read read
#define wakeup_close close
#define wakeup_create pipe
#else /* HAVE_PIPE */
#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 /* HAVE_PIPE */
#ifndef HAVE_SOCKETPAIR #ifndef HAVE_SOCKETPAIR
#include <curl/curl.h> #include <curl/curl.h>