asyn-ares: make a single alloc out of hostname + async data

This saves one alloc per name resolve and simplifies the exit path.

Closes #9310
This commit is contained in:
Daniel Stenberg 2022-08-15 16:49:44 +02:00
parent 37dbbbb6c1
commit 14d9d79c87
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -115,6 +115,7 @@ struct thread_data {
#ifndef HAVE_CARES_GETADDRINFO #ifndef HAVE_CARES_GETADDRINFO
struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */ struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
#endif #endif
char hostname[1];
}; };
/* How long we are willing to wait for additional parallel responses after /* How long we are willing to wait for additional parallel responses after
@ -252,8 +253,6 @@ void Curl_resolver_kill(struct Curl_easy *data)
*/ */
static void destroy_async_data(struct Curl_async *async) static void destroy_async_data(struct Curl_async *async)
{ {
free(async->hostname);
if(async->tdata) { if(async->tdata) {
struct thread_data *res = async->tdata; struct thread_data *res = async->tdata;
if(res) { if(res) {
@ -265,8 +264,6 @@ static void destroy_async_data(struct Curl_async *async)
} }
async->tdata = NULL; async->tdata = NULL;
} }
async->hostname = NULL;
} }
/* /*
@ -758,25 +755,18 @@ struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct Curl_easy *data,
int port, int port,
int *waitp) int *waitp)
{ {
char *bufp; struct thread_data *res = NULL;
size_t namelen = strlen(hostname);
*waitp = 0; /* default to synchronous response */ *waitp = 0; /* default to synchronous response */
bufp = strdup(hostname); res = calloc(sizeof(struct thread_data) + namelen, 1);
if(bufp) { if(res) {
struct thread_data *res = NULL; strcpy(res->hostname, hostname);
free(data->state.async.hostname); data->state.async.hostname = res->hostname;
data->state.async.hostname = bufp;
data->state.async.port = port; data->state.async.port = port;
data->state.async.done = FALSE; /* not done */ data->state.async.done = FALSE; /* not done */
data->state.async.status = 0; /* clear */ data->state.async.status = 0; /* clear */
data->state.async.dns = NULL; /* clear */ data->state.async.dns = NULL; /* clear */
res = calloc(sizeof(struct thread_data), 1);
if(!res) {
free(data->state.async.hostname);
data->state.async.hostname = NULL;
return NULL;
}
data->state.async.tdata = res; data->state.async.tdata = res;
/* initial status - failed */ /* initial status - failed */