mirror of
https://github.com/curl/curl.git
synced 2025-02-17 14:59:45 +08:00
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:
parent
37dbbbb6c1
commit
14d9d79c87
@ -115,6 +115,7 @@ struct thread_data {
|
||||
#ifndef HAVE_CARES_GETADDRINFO
|
||||
struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
|
||||
#endif
|
||||
char hostname[1];
|
||||
};
|
||||
|
||||
/* 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)
|
||||
{
|
||||
free(async->hostname);
|
||||
|
||||
if(async->tdata) {
|
||||
struct thread_data *res = async->tdata;
|
||||
if(res) {
|
||||
@ -265,8 +264,6 @@ static void destroy_async_data(struct Curl_async *async)
|
||||
}
|
||||
async->tdata = NULL;
|
||||
}
|
||||
|
||||
async->hostname = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -758,25 +755,18 @@ struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct Curl_easy *data,
|
||||
int port,
|
||||
int *waitp)
|
||||
{
|
||||
char *bufp;
|
||||
|
||||
struct thread_data *res = NULL;
|
||||
size_t namelen = strlen(hostname);
|
||||
*waitp = 0; /* default to synchronous response */
|
||||
|
||||
bufp = strdup(hostname);
|
||||
if(bufp) {
|
||||
struct thread_data *res = NULL;
|
||||
free(data->state.async.hostname);
|
||||
data->state.async.hostname = bufp;
|
||||
res = calloc(sizeof(struct thread_data) + namelen, 1);
|
||||
if(res) {
|
||||
strcpy(res->hostname, hostname);
|
||||
data->state.async.hostname = res->hostname;
|
||||
data->state.async.port = port;
|
||||
data->state.async.done = FALSE; /* not done */
|
||||
data->state.async.status = 0; /* 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;
|
||||
|
||||
/* initial status - failed */
|
||||
|
Loading…
Reference in New Issue
Block a user