mirror of https://gitee.com/openkylin/linux.git
tipc: wake up all waiting threads at socket shutdown
When a socket is shut down, we should wake up all thread sleeping on it, instead of just one of them. Otherwise, when several threads are polling the same socket, and one of them does shutdown(), the remaining threads may end up sleeping forever. Also, to align socket usage with common practice in other stacks, we use one of the common socket callback handlers, sk_state_change(), to wake up pending users. This is similar to the usage in e.g. inet_shutdown(). [net/ipv4/af_inet.c]. Signed-off-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
This commit is contained in:
parent
c4fc298ab4
commit
7503115107
|
@ -1595,10 +1595,11 @@ static int shutdown(struct socket *sock, int how)
|
|||
|
||||
case SS_DISCONNECTING:
|
||||
|
||||
/* Discard any unreceived messages; wake up sleeping tasks */
|
||||
/* Discard any unreceived messages */
|
||||
discard_rx_queue(sk);
|
||||
if (waitqueue_active(sk_sleep(sk)))
|
||||
wake_up_interruptible(sk_sleep(sk));
|
||||
|
||||
/* Wake up anyone sleeping in poll */
|
||||
sk->sk_state_change(sk);
|
||||
res = 0;
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue