[Top][All Lists]

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

Re: [lwip-users] socket memory problem

From: yueyue papa
Subject: Re: [lwip-users] socket memory problem
Date: Fri, 26 Dec 2008 14:52:42 +0800

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

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 (sys_arch_mbox_fetch(conn->recvmbox, (void *)&buf, conn->recv_timeout)==SYS_ARCH_TIMEOUT) {  <====block here
      buf = NULL;
    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.


lwip-users mailing list

reply via email to

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