lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [lwip-users] socket memory problem


From: Muhamad Ikhwan Ismail
Subject: RE: [lwip-users] socket memory problem
Date: Sat, 27 Dec 2008 09:08:13 +0000

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: address@hidden
To: address@hidden
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 <address@hidden>


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 welcome




On 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




_______________________________________________
lwip-users mailing list
address@hidden
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
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users



Send e-mail faster without improving your typing skills. Get your Hotmail® account.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]