From 3d0eb61043c389a40220545b51e0d0f2a5e4ab15 Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Thu, 20 Sep 2018 17:01:17 +0800 Subject: [PATCH] fix(lwip): Fix socket mt sync error --- .../lwip/apps/multi-threads/sockets_mt.c | 51 ++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/components/lwip/apps/multi-threads/sockets_mt.c b/components/lwip/apps/multi-threads/sockets_mt.c index df099e8a..e87c2900 100644 --- a/components/lwip/apps/multi-threads/sockets_mt.c +++ b/components/lwip/apps/multi-threads/sockets_mt.c @@ -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;