mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-24 10:38:01 +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_RECV (1 << 1)
|
||||||
#define SOCK_MT_LOCK_IOCTL (1 << 2)
|
#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_RECV (1 << 0)
|
||||||
#define SOCK_MT_SELECT_SEND (1 << 1)
|
#define SOCK_MT_SELECT_SEND (1 << 1)
|
||||||
|
|
||||||
@ -166,7 +169,12 @@ typedef struct _sock_mt {
|
|||||||
_sock_set_state(s, SOCK_MT_STATE_SOCK); \
|
_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)
|
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)
|
static inline void _sock_set_open(int s, int opened)
|
||||||
{
|
{
|
||||||
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
|
SYS_ARCH_PROTECT(lev);
|
||||||
sockets_mt[s].opened = opened;
|
sockets_mt[s].opened = opened;
|
||||||
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void _sock_set_state(int s, int state)
|
static inline void _sock_set_state(int s, int state)
|
||||||
{
|
{
|
||||||
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
|
SYS_ARCH_PROTECT(lev);
|
||||||
sockets_mt[s].state = state;
|
sockets_mt[s].state = state;
|
||||||
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int _sock_get_state(int s)
|
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;
|
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);
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
@ -202,7 +228,7 @@ static void _sock_set_select(int s, int select)
|
|||||||
SYS_ARCH_UNPROTECT(lev);
|
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);
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
@ -216,7 +242,6 @@ static int _sock_try_lock(int s, int l)
|
|||||||
int ret = ERR_OK;
|
int ret = ERR_OK;
|
||||||
SYS_ARCH_DECL_PROTECT(lev);
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
SYS_ARCH_PROTECT(lev);
|
|
||||||
if (!_sock_is_opened(s)) {
|
if (!_sock_is_opened(s)) {
|
||||||
ret = ERR_CLSD;
|
ret = ERR_CLSD;
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -227,11 +252,11 @@ static int _sock_try_lock(int s, int l)
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_ARCH_PROTECT(lev);
|
||||||
sockets_mt[s].lock |= l;
|
sockets_mt[s].lock |= l;
|
||||||
|
|
||||||
exit:
|
|
||||||
SYS_ARCH_UNPROTECT(lev);
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
|
|
||||||
|
exit:
|
||||||
return ret;
|
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);
|
SOCK_MT_DEBUG(1, "s %d l %d exit ", s, l);
|
||||||
|
|
||||||
SYS_ARCH_PROTECT(lev);
|
SYS_ARCH_PROTECT(lev);
|
||||||
|
|
||||||
sockets_mt[s].lock &= ~l;
|
sockets_mt[s].lock &= ~l;
|
||||||
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
|
|
||||||
if (!_sock_is_opened(s)) {
|
if (!_sock_is_opened(s)) {
|
||||||
ret = ERR_CLSD;
|
ret = ERR_CLSD;
|
||||||
@ -274,8 +299,6 @@ static int _sock_unlock(int s, int l)
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
SYS_ARCH_UNPROTECT(lev);
|
|
||||||
|
|
||||||
SOCK_MT_DEBUG(1, "OK %d\n", ret);
|
SOCK_MT_DEBUG(1, "OK %d\n", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -437,14 +460,14 @@ static void lwip_sync_select_mt(int s)
|
|||||||
|
|
||||||
static void lwip_sync_mt(int s, int how)
|
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;
|
struct lwip_sock *sock;
|
||||||
|
|
||||||
while (lock < SOCK_MT_LOCK_IOCTL) {
|
while (lock < SOCK_MT_LOCK_MAX) {
|
||||||
int need_wait = 0;
|
int need_wait = 0;
|
||||||
extern void sys_arch_msleep(int ms);
|
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)) {
|
if (!_sock_get_select(s, SOCK_MT_SELECT_RECV | SOCK_MT_SELECT_SEND)) {
|
||||||
switch (lock) {
|
switch (lock) {
|
||||||
case SOCK_MT_LOCK_SEND:
|
case SOCK_MT_LOCK_SEND:
|
||||||
@ -467,7 +490,7 @@ static void lwip_sync_mt(int s, int how)
|
|||||||
if (need_wait)
|
if (need_wait)
|
||||||
sys_arch_msleep(LWIP_SYNC_MT_SLEEP_MS);
|
sys_arch_msleep(LWIP_SYNC_MT_SLEEP_MS);
|
||||||
|
|
||||||
lock++;
|
lock = _sock_next_lock(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
sock = tryget_socket(s);
|
sock = tryget_socket(s);
|
||||||
@ -510,6 +533,7 @@ int lwip_socket(int domain, int type, int protocol)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lwip_socket_set_so_link(s, 0);
|
lwip_socket_set_so_link(s, 0);
|
||||||
|
_sock_mt_init(s);
|
||||||
_sock_set_open(s, 1);
|
_sock_set_open(s, 1);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
@ -572,6 +596,7 @@ int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lwip_socket_set_so_link(ret, 0);
|
lwip_socket_set_so_link(ret, 0);
|
||||||
|
_sock_mt_init(ret);
|
||||||
_sock_set_open(ret, 1);
|
_sock_set_open(ret, 1);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user