1From b867f6901773def31884a9ae527a1282d274a85d Mon Sep 17 00:00:00 2001 2From: wuchangsheng <wuchangsheng2@huawei.com> 3Date: Sat, 10 Jul 2021 22:27:19 +0800 4Subject: [PATCH] fix epoll_ctl EPOLLET mode error 5--- 6 src/api/sockets.c | 33 +++++++++++++++++++++++---------- 7 1 file changed, 23 insertions(+), 10 deletions(-) 8 9diff --git a/src/api/sockets.c b/src/api/sockets.c 10index 658f762..eccc7f9 100644 11--- a/src/api/sockets.c 12+++ b/src/api/sockets.c 13@@ -714,6 +714,13 @@ free_socket(struct lwip_sock *sock, int is_tcp) 14 /* Protect socket array */ 15 SYS_ARCH_PROTECT(lev); 16 17+#if USE_LIBOS 18+ sock->epoll = LIBOS_EPOLLNONE; 19+ sock->events = 0; 20+ sock->epoll_data = NULL; 21+ list_del_node_null(&sock->list); 22+#endif 23+ 24 freed = free_socket_locked(sock, is_tcp, &conn, &lastdata); 25 SYS_ARCH_UNPROTECT(lev); 26 /* don't use 'sock' after this line, as another task might have allocated it */ 27@@ -1003,13 +1010,6 @@ lwip_close(int s) 28 return -1; 29 } 30 31-#if USE_LIBOS 32- sock->epoll = LIBOS_EPOLLNONE; 33- sock->events = 0; 34- sock->epoll_data = NULL; 35- list_del_node_null(&sock->list); 36-#endif 37- 38 free_socket(sock, is_tcp); 39 set_errno(0); 40 return 0; 41@@ -1191,7 +1191,7 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) 42 if (sock->lastdata.pbuf) { 43 p = sock->lastdata.pbuf; 44 #if USE_LIBOS 45- if ((flags & MSG_PEEK) == 0) { 46+ if (((flags & MSG_PEEK) == 0) && ((sock->epoll & EPOLLET) == 0)) { 47 if ((NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP)) { 48 del_epoll_event(sock->conn, EPOLLIN); 49 } 50@@ -2889,6 +2889,9 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) 51 check_waiters = 0; 52 } 53 #if USE_LIBOS 54+ if (sock->epoll & EPOLLET) { 55+ list_del_node_null(&sock->list); 56+ } 57 add_epoll_event(conn, EPOLLIN); 58 #endif 59 break; 60@@ -2896,7 +2899,9 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) 61 sock->rcvevent--; 62 check_waiters = 0; 63 #if USE_LIBOS 64- del_epoll_event(conn, EPOLLIN); 65+ if ((sock->epoll & EPOLLET) == 0) { 66+ del_epoll_event(conn, EPOLLIN); 67+ } 68 #endif 69 break; 70 case NETCONN_EVT_SENDPLUS: 71@@ -2905,6 +2910,9 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) 72 } 73 sock->sendevent = 1; 74 #if USE_LIBOS 75+ if (sock->epoll & EPOLLET) { 76+ list_del_node_null(&sock->list); 77+ } 78 add_epoll_event(conn, EPOLLOUT); 79 #endif 80 break; 81@@ -2912,12 +2920,17 @@ event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) 82 sock->sendevent = 0; 83 check_waiters = 0; 84 #if USE_LIBOS 85- del_epoll_event(conn, EPOLLOUT); 86+ if ((sock->epoll & EPOLLET) == 0) { 87+ del_epoll_event(conn, EPOLLOUT); 88+ } 89 #endif 90 break; 91 case NETCONN_EVT_ERROR: 92 sock->errevent = 1; 93 #if USE_LIBOS 94+ if (sock->epoll & EPOLLET) { 95+ list_del_node_null(&sock->list); 96+ } 97 add_epoll_event(conn, EPOLLERR); 98 #endif 99 break; 100-- 1012.23.0 102 103