From b71d4477eab7c19c34e57e5c9a1f8add63de7879 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Mon, 6 Mar 2017 22:22:22 +0100 Subject: [PATCH] socket tcp performance tweak: handle window update (call into tcpipi_thread) only once per recv for multi-segment receives --- src/api/sockets.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index fd5c1bf4..aedd7fa9 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -834,7 +834,7 @@ lwip_listen(int s, int backlog) static int lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) { - u8_t apiflags; + u8_t apiflags = NETCONN_NOAUTORCVD; int recvd = 0; int recv_left = len; @@ -873,8 +873,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) sock->conn->callback(sock->conn, NETCONN_EVT_RCVPLUS, 0); } } - sock_set_errno(sock, 0); - return recvd; + goto lwip_recv_tcp_done; } /* We should really do some error checking here. */ LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: p == NULL, error is \"%s\"!\n", @@ -928,6 +927,12 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) apiflags |= NETCONN_DONTBLOCK; /* @todo: do we need to support peeking more than one pbuf? */ } while ((recv_left > 0) || (flags & MSG_PEEK)); +lwip_recv_tcp_done: + if (recvd > 0) { + /* ensure window update after copying all data */ + netconn_tcp_recvd(sock->conn, recvd); + } + sock_set_errno(sock, 0); return recvd; }