Hi..
TCP_PCB are resource under MEMP module (in 1.3.0) and can only be released by closing the connection (socket/netconn API/raw API). Hope this helps.
Greetings, M Ikhwan Ismail
Date: Fri, 26 Dec 2008 17:04:11 +0800 From: address@hidden To: address@hidden Subject: Re: [lwip-users] socket memory problem
if(sock->conn == NULL) { /** * Need free memory */ !!! I have not find how to free the memory. I tried netbuf_delete(buf); but not solve problem
}
The netbuf_delet(buf) will free the some of the memory, but I meet out of TCP_PCB
memp_malloc: out of memory in pool TCP_PCB
i could not find where to free TCP_PCB in my case.
Give me a suggstion.
On Fri, Dec 26, 2008 at 2:52 PM, yueyue papa <address@hidden> wrote:
we find the memory leak in current usage today.
block in struct netbuf * netconn_recv(struct netconn *conn) {
.... msg.msg.conn = conn; if (buf != NULL) {
msg.msg.msg.r.len = buf->p->tot_len;
} else { msg.msg.msg.r.len = 1; } TCPIP_APIMSG(&msg); <=== block here
If net receive block TCPIP_APIMSG, the close will wake up the the block, and the memory leak will happen in socket.c
int lwip_recvfrom(int s, void *mem, int len, unsigned int flags, struct sockaddr *from, socklen_t *fromlen) {
... /* No data was left from the previous operation, so we try to get
some from the network. */ sock->lastdata = buf = netconn_recv(sock->conn); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: netconn_recv netbuf=%p\n", (void*)buf)); <===get return
/** * socket connection validate check */ if(sock->conn == NULL) { /** * Need free memory */ !!! I have not find how to free the memory. I tried netbuf_delete(buf); but not solve problem
} There is no socket connection valid check in here, the invalid socet will cuase memory leak.
Any suggestion is welcomeOn Wed, Dec 24, 2008 at 1:16 PM, yueyue papa <address@hidden> wrote:
Thanks all
The problem is solved
One task call lwip_read
block in
struct netbuf * netconn_recv(struct netconn *conn) { ... #endif /* LWIP_TCP */ } else { #if (LWIP_UDP || LWIP_RAW)
#if LWIP_SO_RCVTIMEO if (sys_arch_mbox_fetch(conn->recvmbox, (void *)&buf, conn->recv_timeout)==SYS_ARCH_TIMEOUT) { <====block here buf = NULL; } #else sys_arch_mbox_fetch(conn->recvmbox, (void *)&buf, 0);
#endif /* LWIP_SO_RCVTIMEO*/
... }
Another task called lwip_close() won't let the netconn_recv exit the block status.
And then our application make force delete task, so one memory is leaked.
As Alain M suggest, we added a timeout for lwip_read, so the block will be exit, and then the block thread won't be killed later.
If lwip_close could wake up the lwip_read is perfect.
On Wed, Dec 24, 2008 at 12:30 AM, Alain M. <address@hidden> wrote:
yueyue papa escreveu:
I am using lwIP socket interface. I meet a kind of memory leak.
My question
1. Whether my flow break the lwIP pre-required condition.
Already answered by Kieran
2. How could I make quick fixed.
As this problems will happen in almost all platforms, including Linux usualy, what I use to do is: make your socket read non blocking with a "small" timeout, on exit make a loop testing for an abort flag and if requested, cleanup and exit the thread, that is a "normal" way of aborting.
Alain
It’s the same Hotmail®. If by “same” you mean up to 70% faster. Get your account now.
|