mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-07-15 08:32:42 +08:00
feat(lwip): Add function to sync "shutdown"
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 module = 0;
|
||||||
int ret;
|
int ret;
|
||||||
struct lwip_sock *sock;
|
struct lwip_sock *sock;
|
||||||
|
|
||||||
while (module < SOCK_MT_SELECT) {
|
while (module < SOCK_MT_SELECT) {
|
||||||
|
int skip = 0;
|
||||||
extern void sys_arch_msleep(int ms);
|
extern void sys_arch_msleep(int ms);
|
||||||
|
|
||||||
SOCK_MT_TRYLOCK(s, module, ret);
|
if (is_need_sync(s, how, module) == false) {
|
||||||
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);
|
|
||||||
module++;
|
module++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -948,13 +969,13 @@ int lwip_fcntl(int s, int cmd, int val)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __lwip_shutdown_mt(int s, int how)
|
int lwip_shutdown(int s, int how)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
LWIP_ENTER_MT(s, SOCK_MT_SHUTDOWN, 0);
|
LWIP_ENTER_MT(s, SOCK_MT_SHUTDOWN, 0);
|
||||||
|
|
||||||
lwip_sync_mt(s);
|
lwip_sync_mt(s, how);
|
||||||
|
|
||||||
ret = lwip_shutdown_esp(s, how);
|
ret = lwip_shutdown_esp(s, how);
|
||||||
|
|
||||||
@ -963,11 +984,6 @@ static int __lwip_shutdown_mt(int s, int how)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lwip_shutdown(int s, int how)
|
|
||||||
{
|
|
||||||
return lwip_shutdown_esp(s, how);
|
|
||||||
}
|
|
||||||
|
|
||||||
int lwip_close(int s)
|
int lwip_close(int s)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -975,7 +991,9 @@ int lwip_close(int s)
|
|||||||
SYS_ARCH_DECL_PROTECT(lev);
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
sys_mutex_t lock_tmp[SOCK_MT_LOCK_MAX];
|
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);
|
LWIP_ENTER_MT(s, SOCK_MT_CLOSE, 0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user