From db259c3557ed962581fbbf02c5c4931eb8ae2004 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Mon, 26 Oct 2009 09:30:50 +0000 Subject: [PATCH] Improved heap usage of lwip_getaddrinfo by only allocating one block of memory per call. --- src/api/netdb.c | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/src/api/netdb.c b/src/api/netdb.c index defa0b9c..69a331be 100644 --- a/src/api/netdb.c +++ b/src/api/netdb.c @@ -234,12 +234,6 @@ lwip_freeaddrinfo(struct addrinfo *ai) struct addrinfo *next; 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; mem_free(ai); ai = next; @@ -274,6 +268,8 @@ lwip_getaddrinfo(const char *nodename, const char *servname, struct addrinfo *ai; struct sockaddr_in *sa = NULL; int port_nr = 0; + size_t total_size; + size_t namelen = 0; if (res == NULL) { return EAI_FAIL; @@ -303,16 +299,18 @@ lwip_getaddrinfo(const char *nodename, const char *servname, 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) { goto memerr; } - memset(ai, 0, sizeof(struct addrinfo)); - sa = mem_malloc(sizeof(struct sockaddr_in)); - if (sa == NULL) { - goto memerr; - } - memset(sa, 0, sizeof(struct sockaddr_in)); + memset(ai, 0, total_size); + sa = (struct sockaddr_in*)((u8_t*)ai + sizeof(struct addrinfo)); /* set up sockaddr */ sa->sin_addr.s_addr = addr.addr; sa->sin_family = AF_INET; @@ -328,12 +326,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname, } if (nodename != NULL) { /* copy nodename to canonname if specified */ - size_t namelen = strlen(nodename); - 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; - } + ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); MEMCPY(ai->ai_canonname, nodename, namelen); ai->ai_canonname[namelen] = 0; } @@ -347,9 +340,6 @@ memerr: if (ai != NULL) { mem_free(ai); } - if (sa != NULL) { - mem_free(sa); - } return EAI_MEMORY; }