mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
Improved heap usage of lwip_getaddrinfo by only allocating one block of memory per call.
This commit is contained in:
parent
bcc87ef851
commit
db259c3557
@ -234,12 +234,6 @@ lwip_freeaddrinfo(struct addrinfo *ai)
|
|||||||
struct addrinfo *next;
|
struct addrinfo *next;
|
||||||
|
|
||||||
while (ai != NULL) {
|
while (ai != NULL) {
|
||||||
if (ai->ai_addr != NULL) {
|
|
||||||
mem_free(ai->ai_addr);
|
|
||||||
}
|
|
||||||
if (ai->ai_canonname != NULL) {
|
|
||||||
mem_free(ai->ai_canonname);
|
|
||||||
}
|
|
||||||
next = ai->ai_next;
|
next = ai->ai_next;
|
||||||
mem_free(ai);
|
mem_free(ai);
|
||||||
ai = next;
|
ai = next;
|
||||||
@ -274,6 +268,8 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
|
|||||||
struct addrinfo *ai;
|
struct addrinfo *ai;
|
||||||
struct sockaddr_in *sa = NULL;
|
struct sockaddr_in *sa = NULL;
|
||||||
int port_nr = 0;
|
int port_nr = 0;
|
||||||
|
size_t total_size;
|
||||||
|
size_t namelen = 0;
|
||||||
|
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
return EAI_FAIL;
|
return EAI_FAIL;
|
||||||
@ -303,16 +299,18 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
|
|||||||
addr.addr = htonl(INADDR_LOOPBACK);
|
addr.addr = htonl(INADDR_LOOPBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
ai = mem_malloc(sizeof(struct addrinfo));
|
total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_in);
|
||||||
|
if (nodename != NULL) {
|
||||||
|
namelen = strlen(nodename);
|
||||||
|
LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1);
|
||||||
|
total_size += namelen + 1;
|
||||||
|
}
|
||||||
|
ai = mem_malloc(total_size);
|
||||||
if (ai == NULL) {
|
if (ai == NULL) {
|
||||||
goto memerr;
|
goto memerr;
|
||||||
}
|
}
|
||||||
memset(ai, 0, sizeof(struct addrinfo));
|
memset(ai, 0, total_size);
|
||||||
sa = mem_malloc(sizeof(struct sockaddr_in));
|
sa = (struct sockaddr_in*)((u8_t*)ai + sizeof(struct addrinfo));
|
||||||
if (sa == NULL) {
|
|
||||||
goto memerr;
|
|
||||||
}
|
|
||||||
memset(sa, 0, sizeof(struct sockaddr_in));
|
|
||||||
/* set up sockaddr */
|
/* set up sockaddr */
|
||||||
sa->sin_addr.s_addr = addr.addr;
|
sa->sin_addr.s_addr = addr.addr;
|
||||||
sa->sin_family = AF_INET;
|
sa->sin_family = AF_INET;
|
||||||
@ -328,12 +326,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
|
|||||||
}
|
}
|
||||||
if (nodename != NULL) {
|
if (nodename != NULL) {
|
||||||
/* copy nodename to canonname if specified */
|
/* copy nodename to canonname if specified */
|
||||||
size_t namelen = strlen(nodename);
|
ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
|
||||||
LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1);
|
|
||||||
ai->ai_canonname = mem_malloc((mem_size_t)(namelen + 1));
|
|
||||||
if (ai->ai_canonname == NULL) {
|
|
||||||
goto memerr;
|
|
||||||
}
|
|
||||||
MEMCPY(ai->ai_canonname, nodename, namelen);
|
MEMCPY(ai->ai_canonname, nodename, namelen);
|
||||||
ai->ai_canonname[namelen] = 0;
|
ai->ai_canonname[namelen] = 0;
|
||||||
}
|
}
|
||||||
@ -347,9 +340,6 @@ memerr:
|
|||||||
if (ai != NULL) {
|
if (ai != NULL) {
|
||||||
mem_free(ai);
|
mem_free(ai);
|
||||||
}
|
}
|
||||||
if (sa != NULL) {
|
|
||||||
mem_free(sa);
|
|
||||||
}
|
|
||||||
return EAI_MEMORY;
|
return EAI_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user