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
>>
>
>
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to