Index: uipc_socket.c =================================================================== --- uipc_socket.c (revision 195257) +++ uipc_socket.c (working copy) @@ -2882,8 +2882,10 @@ { int revents = 0; - SOCKBUF_LOCK(&so->so_snd); - SOCKBUF_LOCK(&so->so_rcv); + if (events & (POLLOUT | POLLWRNORM)) + SOCKBUF_LOCK(&so->so_snd); + if (events & ~(POLLOUT | POLLWRNORM)) + SOCKBUF_LOCK(&so->so_rcv); if (events & (POLLIN | POLLRDNORM)) if (soreadable(so)) revents |= events & (POLLIN | POLLRDNORM); @@ -2915,8 +2917,10 @@ } } - SOCKBUF_UNLOCK(&so->so_rcv); - SOCKBUF_UNLOCK(&so->so_snd); + if (events & ~(POLLOUT | POLLWRNORM)) + SOCKBUF_UNLOCK(&so->so_rcv); + if (events & (POLLOUT | POLLWRNORM)) + SOCKBUF_UNLOCK(&so->so_snd); return (revents); }