Hi..
When you call close(), the application task leaves a message in the mailbox of
the tcpip thread,
so that the tcpip task does the appropriate disconnection and releasing the
memory(one of the is PCB).
If your application task is of lower priority than the tcpip task, and it
doesnt lock itself against preemption,
there should be a task switch after the posting of the message. But the
application task itself will have to wait
until the op_completed semaphore is triggered (same case like recvfrom or send)
Someone most probably has mentioned to you, the sockets of lwip is not
multithread safe. So concurrent access
need to be protected by some kind of mutex e.g. a semaphore.
Hopefully this info would be assistance to you of some kind.
Greetings
M Ikhwan Ismail
Date: Sat, 27 Dec 2008 11:27:38 +0800
From: [email protected]
To: [email protected]
Subject: Re: [lwip-users] socket memory problem
after debug for long time, i think the
memp_malloc: out of memory in pool TCP_PCB
is not caused by memory leak, because i found the TCP_PCB will be used in
future connection.
My test is simple,
Only one socket active, and make connection, receive back 20K data. Another
thread will close the socket after some time. In this test, I could see the out
of memory problem is gone after add netbuf_delet(buf) . I could see out of
memoy for TCP_PCB.
Is it possible it is normal result, because the socket close won't delete the
TCP structure form PCB now, just make a flag. The connection TCP will be delete
after some kinds of time out.
I am sure
1> there is a kind of memoy leak in my test case. Close a blocked socket.
It is fixed by add check whether conn avaiable after netbuf_delet(buf) in
lwip_recvfrom.
2> I am not sure about the out of TCP_PCB is memory leak.
2008/12/26 Muhamad Ikhwan Ismail <[email protected]>
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: [email protected]
To: [email protected]
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 <[email protected]> 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 welcome
On Wed, Dec 24, 2008 at 1:16 PM, yueyue papa <[email protected]> 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. <[email protected]> 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
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users
It's the same Hotmail�. If by "same" you mean up to 70% faster. Get your
account now.
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users
_________________________________________________________________
Send e-mail faster without improving your typing skills.
http://windowslive.com/online/hotmail?ocid=TXT_TAGLM_WL_hotmail_acq_speed_122008_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users