mirror of
https://github.com/curl/curl.git
synced 2025-09-17 09:32:48 +03: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
|
#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 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user