bugfix for improve_performance

This commit is contained in:
xueyunfei
2019-11-30 11:29:47 +08:00
parent 31e24ae95a
commit d2e4de7e45
6 changed files with 113 additions and 11 deletions
+13
View File
@@ -94,8 +94,13 @@
#if LWIP_NETCONN_FULLDUPLEX
#define NETCONN_RECVMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->recvmbox) && (((conn)->flags & NETCONN_FLAG_MBOXINVALID) == 0))
#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & (NETCONN_FLAG_MBOXCLOSED|NETCONN_FLAG_MBOXINVALID)) == 0))
#if ESP_LWIP_LOCK
#define NETCONN_MBOX_WAITING_INC(conn) conn->mbox_threads_waiting += 1
#define NETCONN_MBOX_WAITING_DEC(conn) conn->mbox_threads_waiting -= 1
#else
#define NETCONN_MBOX_WAITING_INC(conn) SYS_ARCH_INC(conn->mbox_threads_waiting, 1)
#define NETCONN_MBOX_WAITING_DEC(conn) SYS_ARCH_DEC(conn->mbox_threads_waiting, 1)
#endif /* ESP_LWIP_LOCK */
#else /* LWIP_NETCONN_FULLDUPLEX */
#define NETCONN_RECVMBOX_WAITABLE(conn) sys_mbox_valid(&(conn)->recvmbox)
#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & NETCONN_FLAG_MBOXCLOSED) == 0))
@@ -585,8 +590,14 @@ netconn_recv_data(struct netconn *conn, void **new_buf, u8_t apiflags)
*new_buf = NULL;
LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;);
#if ESP_LWIP_LOCK
NETCONN_MBOX_WAITING_INC(conn);
#endif /* ESP_LWIP_LOCK */
if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
err_t err = netconn_err(conn);
#if ESP_LWIP_LOCK
NETCONN_MBOX_WAITING_DEC(conn);
#endif /* ESP_LWIP_LOCK */
if (err != ERR_OK) {
/* return pending error */
return err;
@@ -594,7 +605,9 @@ netconn_recv_data(struct netconn *conn, void **new_buf, u8_t apiflags)
return ERR_CONN;
}
#if !ESP_LWIP_LOCK
NETCONN_MBOX_WAITING_INC(conn);
#endif /* !ESP_LWIP_LOCK */
if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) ||
(conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err != ERR_OK)) {
if (sys_arch_mbox_tryfetch(&conn->recvmbox, &buf) == SYS_ARCH_TIMEOUT) {
+4 -1
View File
@@ -922,8 +922,11 @@ netconn_mark_mbox_invalid(struct netconn *conn)
/* Prevent new calls/threads from reading from the mbox */
conn->flags |= NETCONN_FLAG_MBOXINVALID;
#if ESP_LWIP_LOCK
SYS_ARCH_LOCKED(num_waiting = conn->mbox_threads_waiting);
#else
num_waiting = conn->mbox_threads_waiting;
#endif /* ESP_LWIP_LOCK */
for (i = 0; i < num_waiting; i++) {
if (sys_mbox_valid_val(conn->recvmbox)) {
sys_mbox_trypost(&conn->recvmbox, msg);
+72 -10
View File
@@ -289,7 +289,11 @@ static struct lwip_select_cb *select_cb_list;
#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len);
#define DEFAULT_SOCKET_EVENTCB event_callback
#if ESP_LWIP_SELECT
static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent, struct lwip_sock *sock_select);
#else
static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent);
#endif /* LWIP_SOCKET_SELECT */
#else
#define DEFAULT_SOCKET_EVENTCB NULL
#endif
@@ -337,11 +341,17 @@ static int
sock_inc_used(struct lwip_sock *sock)
{
int ret;
#if !ESP_LWIP_LOCK
SYS_ARCH_DECL_PROTECT(lev);
#endif /* !ESP_LWIP_LOCK */
LWIP_ASSERT("sock != NULL", sock != NULL);
#if ESP_LWIP_LOCK
SYS_ARCH_PROTECT_SOCK(sock);
#else
SYS_ARCH_PROTECT(lev);
#endif /* ESP_LWIP_LOCK */
if (sock->fd_free_pending) {
/* prevent new usage of this socket if free is pending */
ret = 0;
@@ -350,7 +360,11 @@ sock_inc_used(struct lwip_sock *sock)
ret = 1;
LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
}
#if ESP_LWIP_LOCK
SYS_ARCH_UNPROTECT_SOCK(sock);
#else
SYS_ARCH_UNPROTECT(lev);
#endif /* ESP_LWIP_LOCK */
return ret;
}
@@ -360,13 +374,22 @@ sock_inc_used_locked(struct lwip_sock *sock)
{
LWIP_ASSERT("sock != NULL", sock != NULL);
#if ESP_LWIP_LOCK
SYS_ARCH_PROTECT_SOCK(sock);
#endif /* ESP_LWIP_LOCK */
if (sock->fd_free_pending) {
LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
#if ESP_LWIP_LOCK
SYS_ARCH_UNPROTECT_SOCK(sock);
#endif /* ESP_LWIP_LOCK */
return 0;
}
++sock->fd_used;
LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
#if ESP_LWIP_LOCK
SYS_ARCH_UNPROTECT_SOCK(sock);
#endif /* ESP_LWIP_LOCK */
return 1;
}
@@ -382,10 +405,16 @@ done_socket(struct lwip_sock *sock)
int is_tcp = 0;
struct netconn *conn = NULL;
union lwip_sock_lastdata lastdata;
#if !ESP_LWIP_LOCK
SYS_ARCH_DECL_PROTECT(lev);
#endif /* !ESP_LWIP_LOCK */
LWIP_ASSERT("sock != NULL", sock != NULL);
#if ESP_LWIP_LOCK
SYS_ARCH_PROTECT_SOCK(sock);
#else
SYS_ARCH_PROTECT(lev);
#endif /* ESP_LWIP_LOCK */
LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0);
if (--sock->fd_used == 0) {
if (sock->fd_free_pending) {
@@ -395,7 +424,11 @@ done_socket(struct lwip_sock *sock)
freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
}
}
#if ESP_LWIP_LOCK
SYS_ARCH_UNPROTECT_SOCK(sock);
#else
SYS_ARCH_UNPROTECT(lev);
#endif /* ESP_LWIP_LOCK */
if (freed) {
free_socket_free_elements(is_tcp, conn, &lastdata);
@@ -536,6 +569,14 @@ alloc_socket(struct netconn *newconn, int accepted)
sockets[i].sendevent = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1);
sockets[i].errevent = 0;
#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
#if ESP_LWIP_LOCK
if (!sockets[i].lock) {
/* one time init and never free */
if (sys_mutex_new(&sockets[i].lock) != ERR_OK) {
return -1;
}
}
#endif
return i + LWIP_SOCKET_OFFSET;
}
SYS_ARCH_UNPROTECT(lev);
@@ -602,13 +643,23 @@ free_socket(struct lwip_sock *sock, int is_tcp)
int freed;
struct netconn *conn;
union lwip_sock_lastdata lastdata;
#if !ESP_LWIP_LOCK
SYS_ARCH_DECL_PROTECT(lev);
#endif /* !ESP_LWIP_LOCK */
/* Protect socket array */
#if ESP_LWIP_LOCK
SYS_ARCH_PROTECT_SOCK(sock);
#else
SYS_ARCH_PROTECT(lev);
#endif /* ESP_LWIP_LOCK */
freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
#if ESP_LWIP_LOCK
SYS_ARCH_UNPROTECT_SOCK(sock);
#else
SYS_ARCH_UNPROTECT(lev);
#endif /* ESP_LWIP_LOCK */
/* don't use 'sock' after this line, as another task might have allocated it */
if (freed) {
@@ -2509,8 +2560,11 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
s = conn->socket;
SYS_ARCH_UNPROTECT(lev);
}
#if ESP_LWIP_LOCK
sock = tryget_socket_unconn_nouse(s);
#else
sock = get_socket(s);
#endif /* ESP_LWIP_LOCK */
if (!sock) {
return;
}
@@ -2558,11 +2612,17 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
has_errevent = sock->errevent != 0;
SYS_ARCH_UNPROTECT(lev);
/* Check any select calls waiting on this socket */
#if ESP_LWIP_SELECT
select_check_waiters(s, has_recvevent, has_sendevent, has_errevent, sock);
#else
select_check_waiters(s, has_recvevent, has_sendevent, has_errevent);
} else {
#endif/* LWIP_SOCKET_SELECT */
} else {
SYS_ARCH_UNPROTECT(lev);
}
done_socket(sock);
#if !ESP_LWIP_LOCK
done_socket(sock);
#endif /* !ESP_LWIP_LOCK */
}
/**
@@ -2578,19 +2638,24 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
* select_cb_list during our UNPROTECT/PROTECT. We use a generational counter to
* detect this change and restart the list walk. The list is expected to be small
*/
#if ESP_LWIP_SELECT
static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent, struct lwip_sock *sock_select)
#else
static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent)
#endif /* LWIP_SOCKET_SELECT */
{
struct lwip_select_cb *scb;
struct lwip_sock *sock;
#if ESP_LWIP_SELECT
struct lwip_sock *sock = sock_select;
#else
struct lwip_sock *sock
#endif /* ESP_LWIP_LOCK */
#if !LWIP_TCPIP_CORE_LOCKING
int last_select_cb_ctr;
SYS_ARCH_DECL_PROTECT(lev);
#endif /* !LWIP_TCPIP_CORE_LOCKING */
LWIP_ASSERT_CORE_LOCKED();
#if ESP_LWIP_SELECT
sock = tryget_socket_unconn(s);
#endif/* ESP_LWIP_SELECT */
#if !LWIP_TCPIP_CORE_LOCKING
SYS_ARCH_PROTECT(lev);
again:
@@ -2664,9 +2729,6 @@ again:
last_select_cb_ctr = select_cb_ctr;
}
SYS_ARCH_UNPROTECT(lev);
#if ESP_LWIP_SELECT
done_socket(sock);
#endif/* ESP_LWIP_SELECT */
#endif
}
#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
+5
View File
@@ -89,6 +89,11 @@ struct lwip_sock {
#define LWIP_SOCK_FD_FREE_TCP 1
#define LWIP_SOCK_FD_FREE_FREE 2
#endif
#if ESP_LWIP_LOCK
sys_mutex_t lock;
#endif
};
#ifndef set_errno
+18
View File
@@ -83,6 +83,24 @@ typedef u8_t sys_mbox_t;
#else /* NO_SYS */
#if ESP_LWIP_LOCK
#define SYS_ARCH_PROTECT_CONN(_conn) do {\
sys_mutex_lock(&(_conn)->lock);\
} while(0)
#define SYS_ARCH_UNPROTECT_CONN(_conn) do {\
sys_mutex_unlock(&(_conn)->lock);\
} while(0)
#define SYS_ARCH_PROTECT_SOCK(_sock) do {\
sys_mutex_lock(&(_sock)->lock);\
} while(0)
#define SYS_ARCH_UNPROTECT_SOCK(_sock) do{\
sys_mutex_unlock(&(_sock)->lock);\
} while(0)
#endif /* ESP_LWIP_LOCK */
/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */
#define SYS_ARCH_TIMEOUT 0xffffffffUL
+1
View File
@@ -100,5 +100,6 @@
#define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1
#define ESP_GRATUITOUS_ARP 1
#define ESP_LWIP_SELECT 1
#define ESP_LWIP_LOCK 1
#endif /* LWIP_HDR_LWIPOPTS_H */