Skip to content

Commit 4556619

Browse files
committed
fix(lwip): Fix socket shutdown blocking issue
internal: 85fb56d0
1 parent 87bc754 commit 4556619

File tree

3 files changed

+28
-36
lines changed

3 files changed

+28
-36
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ gwen:
1313
gitlab:
1414
espconn: 3a998034
1515
freertos: 66a199b7
16-
lwip: 829319d2
16+
lwip: 4dd2bcd3
1717
driver: 7bee5263
1818
mbedtls: 1ac9f1f4
1919
ssl: eefb383a

lib/liblwip.a

924 Bytes
Binary file not shown.

third_party/lwip/api/multi-threads/sockets_mt.c

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ enum sock_mt_stat{
2121
};
2222

2323
enum sock_mt_shutdown {
24-
SOCK_MT_SHUTDOWN_NONE = 0,
25-
SOCK_MT_SHUTDOWN_OK
24+
SOCK_MT_SHUTDOWN_OK = 0,
25+
SOCK_MT_SHUTDOWN_NONE
2626
};
2727

2828
enum sock_mt_module {
@@ -88,15 +88,21 @@ typedef struct _sock_mt sock_mt_t;
8888
SYS_ARCH_DECL_PROTECT(lev); \
8989
\
9090
SYS_ARCH_PROTECT(lev); \
91-
if (sockets_mt[s].lock[l]) \
92-
err = sys_mutex_trylock(&sockets_mt[s].lock[l]); \
91+
if (SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE) \
92+
err = ERR_CLSD; \
9393
else \
94-
err = ERR_VAL; \
94+
err = ERR_OK; \
95+
if (err == ERR_OK) { \
96+
if (sockets_mt[s].lock[l]) \
97+
err = sys_mutex_trylock(&sockets_mt[s].lock[l]); \
98+
else \
99+
err = ERR_VAL; \
100+
} \
95101
SYS_ARCH_UNPROTECT(lev); \
96102
\
97103
if (err == ERR_OK) \
98104
break; \
99-
else if (err == ERR_VAL) \
105+
else if (err == ERR_VAL || err == ERR_CLSD) \
100106
return -1; \
101107
\
102108
vTaskDelay(1); \
@@ -111,13 +117,19 @@ typedef struct _sock_mt sock_mt_t;
111117
SYS_ARCH_DECL_PROTECT(lev); \
112118
\
113119
SYS_ARCH_PROTECT(lev); \
114-
if (sockets_mt[s].lock[l]) \
115-
r = sys_mutex_trylock(&sockets_mt[s].lock[l]); \
120+
if (SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE) \
121+
r = ERR_CLSD; \
116122
else \
117-
r = ERR_VAL; \
123+
r = ERR_OK; \
124+
if (r == ERR_OK) { \
125+
if (sockets_mt[s].lock[l]) \
126+
r = sys_mutex_trylock(&sockets_mt[s].lock[l]); \
127+
else \
128+
r = ERR_VAL; \
129+
} \
118130
SYS_ARCH_UNPROTECT(lev); \
119131
\
120-
if (r == ERR_OK || ERR_VAL) \
132+
if (r == ERR_OK || r == ERR_VAL || r == ERR_CLSD) \
121133
break; \
122134
vTaskDelay(1); \
123135
} \
@@ -242,16 +254,9 @@ LOCAL int lwip_enter_mt_state(int s, int arg)
242254
return -1;
243255

244256
SOCK_MT_LOCK(s, SOCK_MT_STATE_LOCK);
245-
if (SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE) {
246-
goto failed;
247-
}
248257
SOCK_MT_SET_STATE(s, arg);
249258

250259
return 0;
251-
252-
failed:
253-
SOCK_MT_UNLOCK(s, SOCK_MT_STATE_LOCK);
254-
return -1;
255260
}
256261

257262
LOCAL int lwip_enter_mt_recv(int s, int arg)
@@ -261,20 +266,14 @@ LOCAL int lwip_enter_mt_recv(int s, int arg)
261266
return -1;
262267

263268
SOCK_MT_LOCK(s, SOCK_MT_RECV_LOCK);
264-
if (SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE) {
265-
goto failed;
266-
}
267269

268270
return 0;
269-
270-
failed:
271-
SOCK_MT_UNLOCK(s, SOCK_MT_RECV_LOCK);
272-
return -1;
273271
}
274272

275273
LOCAL int lwip_enter_mt_shutdown(int s, int arg)
276274
{
277-
if(tryget_socket(s) == NULL)
275+
if(tryget_socket(s) == NULL
276+
|| SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE)
278277
return -1;
279278

280279
SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_SHUTDOWN_OK);
@@ -313,7 +312,7 @@ LOCAL int lwip_enter_mt_select(int s, int arg)
313312

314313
SOCK_MT_SET_READ_SEL(i);
315314
SOCK_MT_LOCK_RET(i, SOCK_MT_RECV_LOCK, err);
316-
if (err != ERR_OK || SOCK_MT_GET_SHUTDOWN(i) != SOCK_MT_SHUTDOWN_NONE) {
315+
if (err != ERR_OK) {
317316
goto failed2;
318317
}
319318
}
@@ -323,7 +322,7 @@ LOCAL int lwip_enter_mt_select(int s, int arg)
323322

324323
SOCK_MT_SET_WRITE_SEL(i);
325324
SOCK_MT_LOCK_RET(i, SOCK_MT_STATE_LOCK, err);
326-
if (err != ERR_OK || SOCK_MT_GET_SHUTDOWN(i) != SOCK_MT_SHUTDOWN_NONE) {
325+
if (err != ERR_OK) {
327326
goto failed3;
328327
}
329328
}
@@ -361,15 +360,8 @@ LOCAL int lwip_enter_mt_ioctrl(int s, int arg)
361360
return -1;
362361

363362
SOCK_MT_LOCK(s, SOCK_MT_IOCTRL_LOCK);
364-
if (SOCK_MT_GET_SHUTDOWN(s) != SOCK_MT_SHUTDOWN_NONE) {
365-
goto failed;
366-
}
367363

368364
return 0;
369-
370-
failed:
371-
SOCK_MT_UNLOCK(s, SOCK_MT_IOCTRL_LOCK);
372-
return -1;
373365
}
374366

375367
LOCAL int lwip_exit_mt_state(int s, int arg)
@@ -397,7 +389,7 @@ LOCAL int lwip_exit_mt_recv(int s, int arg)
397389

398390
LOCAL int lwip_exit_mt_shutdown(int s, int arg)
399391
{
400-
SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_STATE_NONE);
392+
//SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_STATE_NONE);
401393
return 0;
402394
}
403395

0 commit comments

Comments
 (0)