mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-23 10:08:06 +08:00
fix(lwip): Fix socket mt sync error
This commit is contained in:
@ -133,6 +133,9 @@ typedef int (*lwip_io_mt_fn)(int, int );
|
||||
#define SOCK_MT_LOCK_RECV (1 << 1)
|
||||
#define SOCK_MT_LOCK_IOCTL (1 << 2)
|
||||
|
||||
#define SOCK_MT_LOCK_MIN SOCK_MT_LOCK_SEND
|
||||
#define SOCK_MT_LOCK_MAX SOCK_MT_LOCK_IOCTL
|
||||
|
||||
#define SOCK_MT_SELECT_RECV (1 << 0)
|
||||
#define SOCK_MT_SELECT_SEND (1 << 1)
|
||||
|
||||
@ -166,7 +169,12 @@ typedef struct _sock_mt {
|
||||
_sock_set_state(s, SOCK_MT_STATE_SOCK); \
|
||||
}
|
||||
|
||||
static sock_mt_t sockets_mt[NUM_SOCKETS];
|
||||
static sock_mt_t DRAM_ATTR sockets_mt[NUM_SOCKETS];
|
||||
|
||||
static inline void _sock_mt_init(int s)
|
||||
{
|
||||
memset(&sockets_mt[s], 0, sizeof(sock_mt_t));
|
||||
}
|
||||
|
||||
static inline int _sock_is_opened(int s)
|
||||
{
|
||||
@ -175,12 +183,20 @@ static inline int _sock_is_opened(int s)
|
||||
|
||||
static inline void _sock_set_open(int s, int opened)
|
||||
{
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
|
||||
SYS_ARCH_PROTECT(lev);
|
||||
sockets_mt[s].opened = opened;
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
}
|
||||
|
||||
static inline void _sock_set_state(int s, int state)
|
||||
{
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
|
||||
SYS_ARCH_PROTECT(lev);
|
||||
sockets_mt[s].state = state;
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
}
|
||||
|
||||
static inline int _sock_get_state(int s)
|
||||
@ -193,7 +209,17 @@ static inline int _sock_get_select(int s, int select)
|
||||
return sockets_mt[s].select & select;
|
||||
}
|
||||
|
||||
static void _sock_set_select(int s, int select)
|
||||
static int inline _sock_is_lock(int s, int l)
|
||||
{
|
||||
return sockets_mt[s].lock & l;
|
||||
}
|
||||
|
||||
static int inline _sock_next_lock(int lock)
|
||||
{
|
||||
return lock << 1;
|
||||
}
|
||||
|
||||
static void inline _sock_set_select(int s, int select)
|
||||
{
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
|
||||
@ -202,7 +228,7 @@ static void _sock_set_select(int s, int select)
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
}
|
||||
|
||||
static void _sock_reset_select(int s, int select)
|
||||
static void inline _sock_reset_select(int s, int select)
|
||||
{
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
|
||||
@ -216,7 +242,6 @@ static int _sock_try_lock(int s, int l)
|
||||
int ret = ERR_OK;
|
||||
SYS_ARCH_DECL_PROTECT(lev);
|
||||
|
||||
SYS_ARCH_PROTECT(lev);
|
||||
if (!_sock_is_opened(s)) {
|
||||
ret = ERR_CLSD;
|
||||
goto exit;
|
||||
@ -227,11 +252,11 @@ static int _sock_try_lock(int s, int l)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
SYS_ARCH_PROTECT(lev);
|
||||
sockets_mt[s].lock |= l;
|
||||
|
||||
exit:
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -265,8 +290,8 @@ static int _sock_unlock(int s, int l)
|
||||
SOCK_MT_DEBUG(1, "s %d l %d exit ", s, l);
|
||||
|
||||
SYS_ARCH_PROTECT(lev);
|
||||
|
||||
sockets_mt[s].lock &= ~l;
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
|
||||
if (!_sock_is_opened(s)) {
|
||||
ret = ERR_CLSD;
|
||||
@ -274,8 +299,6 @@ static int _sock_unlock(int s, int l)
|
||||
}
|
||||
|
||||
exit:
|
||||
SYS_ARCH_UNPROTECT(lev);
|
||||
|
||||
SOCK_MT_DEBUG(1, "OK %d\n", ret);
|
||||
|
||||
return ret;
|
||||
@ -437,14 +460,14 @@ static void lwip_sync_select_mt(int s)
|
||||
|
||||
static void lwip_sync_mt(int s, int how)
|
||||
{
|
||||
int lock = SOCK_MT_LOCK_SEND;
|
||||
int lock = SOCK_MT_LOCK_MIN;
|
||||
struct lwip_sock *sock;
|
||||
|
||||
while (lock < SOCK_MT_LOCK_IOCTL) {
|
||||
while (lock < SOCK_MT_LOCK_MAX) {
|
||||
int need_wait = 0;
|
||||
extern void sys_arch_msleep(int ms);
|
||||
|
||||
if (_sock_try_lock(s, lock) == ERR_INPROGRESS) {
|
||||
if (_sock_is_lock(s, lock)) {
|
||||
if (!_sock_get_select(s, SOCK_MT_SELECT_RECV | SOCK_MT_SELECT_SEND)) {
|
||||
switch (lock) {
|
||||
case SOCK_MT_LOCK_SEND:
|
||||
@ -467,7 +490,7 @@ static void lwip_sync_mt(int s, int how)
|
||||
if (need_wait)
|
||||
sys_arch_msleep(LWIP_SYNC_MT_SLEEP_MS);
|
||||
|
||||
lock++;
|
||||
lock = _sock_next_lock(lock);
|
||||
}
|
||||
|
||||
sock = tryget_socket(s);
|
||||
@ -510,6 +533,7 @@ int lwip_socket(int domain, int type, int protocol)
|
||||
return -1;
|
||||
|
||||
lwip_socket_set_so_link(s, 0);
|
||||
_sock_mt_init(s);
|
||||
_sock_set_open(s, 1);
|
||||
|
||||
return s;
|
||||
@ -572,6 +596,7 @@ int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
return -1;
|
||||
|
||||
lwip_socket_set_so_link(ret, 0);
|
||||
_sock_mt_init(ret);
|
||||
_sock_set_open(ret, 1);
|
||||
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user