Skip to content

Commit 8fe4c1d

Browse files
committed
fix(lwip): Fix "shutdown" blocks "close" when enable multi-thread support
1 parent 77552dd commit 8fe4c1d

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

components/lwip/apps/multi-threads/sockets_mt.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,14 +494,24 @@ static void lwip_sync_mt(int s, int how)
494494
extern void sys_arch_msleep(int ms);
495495

496496
if (!_sock_get_select(s, SOCK_MT_SELECT_RECV | SOCK_MT_SELECT_SEND)) {
497+
SOCK_MT_DEBUG(1, "lock state=%d how=%d\n", lock, how);
498+
497499
switch (lock) {
498500
case SOCK_MT_LOCK_SEND:
499-
lwip_sync_state_mt(s);
500-
need_wait = 1;
501+
if (how == SHUT_WR || how == SHUT_RDWR) {
502+
lwip_sync_state_mt(s);
503+
need_wait = 1;
504+
} else {
505+
lock = _sock_next_lock(lock);
506+
}
501507
break;
502508
case SOCK_MT_LOCK_RECV:
503-
lwip_sync_recv_mt(s);
504-
need_wait = 1;
509+
if (how == SHUT_RD || how == SHUT_RDWR) {
510+
lwip_sync_recv_mt(s);
511+
need_wait = 1;
512+
} else {
513+
lock = _sock_next_lock(lock);
514+
}
505515
break;
506516
default :
507517
break;
@@ -769,7 +779,24 @@ int lwip_fcntl(int s, int cmd, int val)
769779

770780
int lwip_shutdown(int s, int how)
771781
{
772-
return lwip_shutdown_esp(s, how);
782+
int ret;
783+
SYS_ARCH_DECL_PROTECT(lev);
784+
785+
if (tryget_socket(s) == NULL)
786+
return -1;
787+
788+
SYS_ARCH_PROTECT(lev);
789+
if (!_sock_is_opened(s)) {
790+
SYS_ARCH_UNPROTECT(lev);
791+
return -1;
792+
}
793+
SYS_ARCH_UNPROTECT(lev);
794+
795+
lwip_sync_mt(s, how);
796+
797+
ret = lwip_shutdown_esp(s, how);
798+
799+
return ret;
773800
}
774801

775802
int lwip_close(int s)

0 commit comments

Comments
 (0)