Index: CHANGELOG
===================================================================
RCS file: /sources/lwip/lwip/CHANGELOG,v
retrieving revision 1.87
diff -u -3 -p -r1.87 CHANGELOG
--- CHANGELOG	20 Mar 2007 18:12:06 -0000	1.87
+++ CHANGELOG	20 Mar 2007 19:33:27 -0000
@@ -66,6 +66,13 @@ HISTORY
   * api_lib.c: Use memcpy in netbuf_copy_partial.
 
   ++ Bug fixes:
+
+  2007-03-20 Frédéric Bernon
+  * api_lib.c, tcpip.c: integrate sys_mbox_fetch(conn->mbox, NULL) calls from
+    api_lib.c to tcpip.c's tcpip_apimsg(). Now, use a local variable and not a
+    dynamic one from memp to send tcpip_msg to tcpip_thread in a synchrone call.
+    Free tcpip_msg from tcpip_apimsg is not done in tcpip_thread. This give a
+    faster and more reliable communication between api_lib and tcpip.
   
   2007-03-20 Frédéric Bernon
   * memp.h, stats.c: Fix stats_display function where memp_names table wasn't

Index: src/api/api_lib.c
===================================================================
RCS file: /sources/lwip/lwip/src/api/api_lib.c,v
retrieving revision 1.30
diff -u -3 -p -r1.30 api_lib.c
--- src/api/api_lib.c	11 Mar 2007 19:16:38 -0000	1.30
+++ src/api/api_lib.c	20 Mar 2007 19:35:58 -0000
@@ -226,17 +226,16 @@ netconn *netconn_new_with_proto_and_call
   }
   conn->state        = NETCONN_NONE;
   conn->socket       = 0;
+  conn->callback     = callback;
+  conn->recv_avail   = 0;
 #if LWIP_SO_RCVTIMEO
   conn->recv_timeout = 0;
 #endif /* LWIP_SO_RCVTIMEO */
-  conn->callback     = callback;
-  conn->recv_avail   = 0;
 
   msg.type = API_MSG_NEWCONN;
   msg.msg.msg.bc.port = proto; /* misusing the port field */
   msg.msg.conn = conn;
   api_msg_post(&msg);  
-  sys_mbox_fetch(conn->mbox, NULL);
 
   if ( conn->err != ERR_OK ) {
     memp_free(MEMP_NETCONN, conn);
@@ -274,7 +273,6 @@ netconn_delete(struct netconn *conn)
   msg.type = API_MSG_DELCONN;
   msg.msg.conn = conn;
   api_msg_post(&msg);  
-  sys_mbox_fetch(conn->mbox, NULL);
 
   /* Drain the recvmbox. */
   if (conn->recvmbox != SYS_MBOX_NULL) {
@@ -303,10 +301,12 @@ netconn_delete(struct netconn *conn)
 
   sys_mbox_free(conn->mbox);
   conn->mbox = SYS_MBOX_NULL;
+
   if (conn->sem != SYS_SEM_NULL) {
     sys_sem_free(conn->sem);
+    /* conn->sem = SYS_SEM_NULL; */
   }
-  /*  conn->sem = SYS_SEM_NULL;*/
+
   memp_free(MEMP_NETCONN, conn);
   return ERR_OK;
 }
@@ -389,7 +389,6 @@ netconn_bind(struct netconn *conn, struc
   msg.msg.msg.bc.ipaddr = addr;
   msg.msg.msg.bc.port = port;
   api_msg_post(&msg);
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 }
 
@@ -416,7 +415,6 @@ netconn_connect(struct netconn *conn, st
   msg.msg.msg.bc.ipaddr = addr;
   msg.msg.msg.bc.port = port;
   api_msg_post(&msg);
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 }
 
@@ -432,7 +430,6 @@ netconn_disconnect(struct netconn *conn)
   msg.type = API_MSG_DISCONNECT;
   msg.msg.conn = conn;  
   api_msg_post(&msg);
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 
 }
@@ -456,7 +453,6 @@ netconn_listen(struct netconn *conn)
   msg.type = API_MSG_LISTEN;
   msg.msg.conn = conn;
   api_msg_post(&msg);
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 }
 
@@ -550,7 +546,6 @@ netconn_recv(struct netconn *conn)
     }
     api_msg_post(&msg);
 
-    sys_mbox_fetch(conn->mbox, NULL);
   } else {
 #if LWIP_SO_RCVTIMEO
     sys_mbox_fetch_timeout(conn->recvmbox, (void *)&buf, conn->recv_timeout);
@@ -593,7 +588,6 @@ netconn_send(struct netconn *conn, struc
   msg.msg.msg.p = buf->p;
   api_msg_post(&msg);
 
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 }
 
@@ -641,7 +635,6 @@ netconn_write(struct netconn *conn, cons
     LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_write: writing %d bytes (%d)\n", len, copy));
     msg.msg.msg.w.len = len;
     api_msg_post(&msg);
-    sys_mbox_fetch(conn->mbox, NULL);
     if (conn->err == ERR_OK) {
       dataptr = (void *)((u8_t *)dataptr + len);
       size -= len;
@@ -672,7 +665,6 @@ netconn_close(struct netconn *conn)
   msg.type = API_MSG_CLOSE;
   msg.msg.conn = conn;
   api_msg_post(&msg);
-  sys_mbox_fetch(conn->mbox, NULL);
   if (conn->err == ERR_MEM &&
      conn->sem != SYS_SEM_NULL) {
     sys_sem_wait(conn->sem);
@@ -700,15 +692,14 @@ netconn_join_leave_group (struct netconn
     return conn->err;
   }
 
-  msg.type = API_MSG_JOIN_LEAVE;
-  msg.msg.conn = conn;
   ipaddr[0] = multiaddr;
   ipaddr[1] = interface;
+
+  msg.type = API_MSG_JOIN_LEAVE;
+  msg.msg.conn = conn;
   msg.msg.msg.bc.ipaddr = (struct ip_addr *)ipaddr;
   msg.msg.msg.bc.port = join_or_leave;
   api_msg_post(&msg);
-  
-  sys_mbox_fetch(conn->mbox, NULL);
   return conn->err;
 }
 #endif /* LWIP_IGMP */
Index: src/api/tcpip.c
===================================================================
RCS file: /sources/lwip/lwip/src/api/tcpip.c,v
retrieving revision 1.28
diff -u -3 -p -r1.28 tcpip.c
--- src/api/tcpip.c	20 Mar 2007 18:01:40 -0000	1.28
+++ src/api/tcpip.c	20 Mar 2007 19:36:38 -0000
@@ -206,7 +206,10 @@ tcpip_thread(void *arg)
     default:
       break;
     }
-    memp_free(MEMP_TCPIP_MSG, msg);
+    
+    if (msg->type!=TCPIP_MSG_API) {
+      memp_free(MEMP_TCPIP_MSG, msg);
+    }
   }
 }
 
@@ -279,16 +282,13 @@ tcpip_callback(void (*f)(void *ctx), voi
 err_t
 tcpip_apimsg(struct api_msg *apimsg)
 {
-  struct tcpip_msg *msg;
+  struct tcpip_msg msg;
   
   if (mbox != SYS_MBOX_NULL) {
-    msg = memp_malloc(MEMP_TCPIP_MSG);
-    if (msg == NULL) {
-      return ERR_MEM;
-    }
-    msg->type = TCPIP_MSG_API;
-    msg->msg.apimsg = apimsg;
-    sys_mbox_post(mbox, msg);
+    msg.type = TCPIP_MSG_API;
+    msg.msg.apimsg = apimsg;
+    sys_mbox_post(mbox, &msg);
+    sys_mbox_fetch(apimsg->msg.conn->mbox, NULL);
     return ERR_OK;
   }
   return ERR_VAL;
