diff --git a/CHANGELOG b/CHANGELOG index 005ccbe8..da2c6105 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -19,6 +19,12 @@ HISTORY ++ New features: + 2007-10-24 Frédéric Bernon + * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than + TCP_EVENT_xxx macros to get a code more readable. It could also help to remove + some code (like we have talk in "patch #5919 : Create compile switch to remove + select code"), but it could be done later. + 2007-10-08 Simon Goldschmidt * many files: Changed initialization: many init functions are not needed any more since we now rely on the compiler initializing global and static diff --git a/src/api/api_lib.c b/src/api/api_lib.c index f3bd104c..954f4e3e 100644 --- a/src/api/api_lib.c +++ b/src/api/api_lib.c @@ -385,8 +385,7 @@ netconn_accept(struct netconn *conn) #endif /* LWIP_SO_RCVTIMEO*/ /* Register event with callback */ - if (conn->callback) - (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, 0); + API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); return newconn; } @@ -449,14 +448,12 @@ netconn_recv(struct netconn *conn) } /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, len); - } + API_EVENT(conn, NETCONN_EVT_RCVMINUS, len); /* If we are closed, we indicate that we no longer wish to use the socket */ if (p == NULL) { memp_free(MEMP_NETBUF, buf); - /* Avoid to loose any previous error code */ + /* Avoid to lose any previous error code */ if (conn->err == ERR_OK) { conn->err = ERR_CLSD; } @@ -490,8 +487,7 @@ netconn_recv(struct netconn *conn) if (buf!=NULL) { conn->recv_avail -= buf->p->tot_len; /* Register event with callback */ - if (conn->callback) - (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, buf->p->tot_len); + API_EVENT(conn, NETCONN_EVT_RCVMINUS, buf->p->tot_len); } #endif /* (LWIP_UDP || LWIP_RAW) */ } diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 98c9de9e..8ae8cf78 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -82,9 +82,7 @@ recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, conn->recv_avail += p->tot_len; /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, p->tot_len); - } + API_EVENT(conn, NETCONN_EVT_RCVPLUS, p->tot_len); sys_mbox_post(conn->recvmbox, buf); } @@ -128,9 +126,7 @@ recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p, conn->recv_avail += p->tot_len; /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, p->tot_len); - } + API_EVENT(conn, NETCONN_EVT_RCVPLUS, p->tot_len); sys_mbox_post(conn->recvmbox, buf); } #endif /* LWIP_UDP */ @@ -165,9 +161,7 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) len = 0; } /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, len); - } + API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); sys_mbox_post(conn->recvmbox, p); return ERR_OK; @@ -203,7 +197,7 @@ poll_tcp(void *arg, struct tcp_pcb *pcb) /** * Sent callback function for TCP netconns. - * Signals the conn->sem and calls conn->callback. + * Signals the conn->sem and calls API_EVENT. * netconn_write waits for conn->sem if send buffer is low. * * @see tcp.h (struct tcp_pcb.sent) for parameters and return value @@ -223,9 +217,9 @@ sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len) do_close_internal(conn); } - if (conn && conn->callback) { + if (conn) { if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT)) { - (*conn->callback)(conn, NETCONN_EVT_SENDPLUS, len); + API_EVENT(conn, NETCONN_EVT_SENDPLUS, len); } } @@ -234,7 +228,7 @@ sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len) /** * Error callback function for TCP netconns. - * Signals conn->sem, posts to all conn mboxes and calls conn->callback. + * Signals conn->sem, posts to all conn mboxes and calls API_EVENT. * The application thread has then to decide what to do. * * @see tcp.h (struct tcp_pcb.err) for parameters @@ -252,9 +246,7 @@ err_tcp(void *arg, err_t err) conn->err = err; if (conn->recvmbox != SYS_MBOX_NULL) { /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0); - } + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); sys_mbox_post(conn->recvmbox, NULL); } if (conn->mbox != SYS_MBOX_NULL && conn->state == NETCONN_CONNECT) { @@ -262,10 +254,8 @@ err_tcp(void *arg, err_t err) sys_mbox_post(conn->mbox, NULL); } if (conn->acceptmbox != SYS_MBOX_NULL) { - /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0); - } + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); sys_mbox_post(conn->acceptmbox, NULL); } if ((conn->state == NETCONN_WRITE) || (conn->state == NETCONN_CLOSE)) { @@ -341,9 +331,7 @@ accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) newconn->acceptmbox = SYS_MBOX_NULL; newconn->err = err; /* Register event with callback */ - if (conn->callback) { - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0); - } + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); /* We have to set the callback here even though * the new socket is unknown. Mark the socket as -1. */ newconn->callback = conn->callback; @@ -469,13 +457,10 @@ do_close_internal(struct netconn *conn) tcp_arg(conn->pcb.tcp, NULL); conn->pcb.tcp = NULL; conn->err = ERR_OK; - /* Trigger select() in socket layer */ - if (conn->callback) { - /* this should send something else so the errorfd is set, - not the read and write fd! */ - (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0); - (*conn->callback)(conn, NETCONN_EVT_SENDPLUS, 0); - } + /* Trigger select() in socket layer. This send should something else so the + errorfd is set, not the read and write fd! */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); /* wake up the application task */ sys_mbox_post(conn->mbox, NULL); } @@ -510,7 +495,7 @@ do_delconn(struct api_msg_msg *msg) case NETCONN_TCP: msg->conn->state = NETCONN_CLOSE; do_close_internal(msg->conn); - /* conn->callback is called inside do_close_internal, before releasing + /* API_EVENT is called inside do_close_internal, before releasing the application thread, so we can return at this point! */ return; #endif /* LWIP_TCP */ @@ -520,13 +505,10 @@ do_delconn(struct api_msg_msg *msg) } /* tcp netconns don't come here! */ - /* Trigger select() in socket layer */ - if (msg->conn->callback) { - /* this send should something else so the errorfd is set, - not the read and write fd! */ - (*msg->conn->callback)(msg->conn, NETCONN_EVT_RCVPLUS, 0); - (*msg->conn->callback)(msg->conn, NETCONN_EVT_SENDPLUS, 0); - } + /* Trigger select() in socket layer. This send should something else so the + errorfd is set, not the read and write fd! */ + API_EVENT(msg->conn, NETCONN_EVT_RCVPLUS, 0); + API_EVENT(msg->conn, NETCONN_EVT_SENDPLUS, 0); if (msg->conn->mbox != SYS_MBOX_NULL) { sys_mbox_post(msg->conn->mbox, NULL); @@ -814,9 +796,8 @@ do_writemore(struct netconn *conn) } err = tcp_output_nagle(conn->pcb.tcp); conn->err = err; - if ((conn->callback) && (err == ERR_OK) && - (tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT)) { - (*conn->callback)(conn, NETCONN_EVT_SENDMINUS, len); + if ((err == ERR_OK) && (tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT)) { + API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); } } else if (err == ERR_MEM) { #if LWIP_TCPIP_CORE_LOCKING diff --git a/src/include/lwip/api.h b/src/include/lwip/api.h index bc3a26e3..d9642916 100644 --- a/src/include/lwip/api.h +++ b/src/include/lwip/api.h @@ -53,6 +53,7 @@ extern "C" { * the same byte order as in the corresponding pcb. */ +/* Flags for netconn_write */ #define NETCONN_NOCOPY 0x00 #define NETCONN_COPY 0x01 @@ -128,6 +129,10 @@ struct netconn { void (* callback)(struct netconn *, enum netconn_evt, u16_t len); }; +/* Register an Network connection event */ +#define API_EVENT(c,e,l) if (c->callback) { \ + (*c->callback)(c, e, l); \ + } /* Network connection functions: */ #define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL)