mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-06-03 11:29:42 +08:00
Merge branch 'bugfix/fix_socket_shutdown_sync' into 'master'
Add function to sync "shutdown" See merge request sdk/ESP8266_RTOS_SDK!286
This commit is contained in:
@ -643,22 +643,43 @@ static void lwip_sync_select_mt(struct lwip_sock *sock)
|
||||
}
|
||||
|
||||
|
||||
static void lwip_sync_mt(int s)
|
||||
static inline bool is_need_sync(int s, int how, int module)
|
||||
{
|
||||
int ret;
|
||||
|
||||
switch (module) {
|
||||
case SOCK_MT_STATE:
|
||||
if (how == SHUT_RD)
|
||||
return false;
|
||||
break;
|
||||
case SOCK_MT_RECV:
|
||||
if (how == SHUT_WR)
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* we always lock the mutex in case of other thread entering,
|
||||
* other thread will be blocked at "SOCK_MT_LOCK" and poll-check
|
||||
*/
|
||||
SOCK_MT_TRYLOCK(s, module, ret);
|
||||
|
||||
return ret == ERR_OK ? false : true;
|
||||
}
|
||||
|
||||
static void lwip_sync_mt(int s, int how)
|
||||
{
|
||||
int module = 0;
|
||||
int ret;
|
||||
struct lwip_sock *sock;
|
||||
|
||||
while (module < SOCK_MT_SELECT) {
|
||||
int skip = 0;
|
||||
extern void sys_arch_msleep(int ms);
|
||||
|
||||
SOCK_MT_TRYLOCK(s, module, ret);
|
||||
if (ret == ERR_OK) {
|
||||
/*
|
||||
* we always lock the mutex in case of other thread entering,
|
||||
* other thread will be blocked at "SOCK_MT_LOCK" and poll-check
|
||||
*/
|
||||
//SOCK_MT_UNLOCK(s, module);
|
||||
if (is_need_sync(s, how, module) == false) {
|
||||
module++;
|
||||
continue;
|
||||
}
|
||||
@ -948,13 +969,13 @@ int lwip_fcntl(int s, int cmd, int val)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __lwip_shutdown_mt(int s, int how)
|
||||
int lwip_shutdown(int s, int how)
|
||||
{
|
||||
int ret;
|
||||
|
||||
LWIP_ENTER_MT(s, SOCK_MT_SHUTDOWN, 0);
|
||||
|
||||
lwip_sync_mt(s);
|
||||
lwip_sync_mt(s, how);
|
||||
|
||||
ret = lwip_shutdown_esp(s, how);
|
||||
|
||||
@ -963,11 +984,6 @@ static int __lwip_shutdown_mt(int s, int how)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int lwip_shutdown(int s, int how)
|
||||
{
|
||||
return lwip_shutdown_esp(s, how);
|
||||
}
|
||||
|
||||
int lwip_close(int s)
|
||||
{
|
||||
int ret;
|
||||
@ -975,7 +991,9 @@ int lwip_close(int s)
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
sys_mutex_t lock_tmp[SOCK_MT_LOCK_MAX];
|
||||
|
||||
__lwip_shutdown_mt(s, SHUT_RDWR);
|
||||
ret = lwip_shutdown(s, SHUT_RDWR);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
LWIP_ENTER_MT(s, SOCK_MT_CLOSE, 0);
|
||||
|
||||
|
Reference in New Issue
Block a user