• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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