diff options
author | rwatson <rwatson@FreeBSD.org> | 2004-06-24 00:54:26 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2004-06-24 00:54:26 +0000 |
commit | e71609f557ffc08ae313e1f890e4083c67d7f797 (patch) | |
tree | 68c6cda2ee73f6a54d0790bf313278aae6cb17c6 | |
parent | ab7b1075ef4b1c6ef29f25ba0f7951a3ae6c418f (diff) | |
download | FreeBSD-src-e71609f557ffc08ae313e1f890e4083c67d7f797.zip FreeBSD-src-e71609f557ffc08ae313e1f890e4083c67d7f797.tar.gz |
Slide socket buffer lock earlier in sopoll() to cover the call into
selrecord(), setting up select and flagging the socker buffers as SB_SEL
and setting up select under the lock.
-rw-r--r-- | sys/kern/uipc_socket.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 5a7e4a3..fe99fe7 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1884,15 +1884,15 @@ sopoll(struct socket *so, int events, struct ucred *active_cred, if (events & (POLLIN | POLLINIGNEOF | POLLPRI | POLLRDNORM | POLLRDBAND)) { - selrecord(td, &so->so_rcv.sb_sel); SOCKBUF_LOCK(&so->so_rcv); + selrecord(td, &so->so_rcv.sb_sel); so->so_rcv.sb_flags |= SB_SEL; SOCKBUF_UNLOCK(&so->so_rcv); } if (events & (POLLOUT | POLLWRNORM)) { - selrecord(td, &so->so_snd.sb_sel); SOCKBUF_LOCK(&so->so_snd); + selrecord(td, &so->so_snd.sb_sel); so->so_snd.sb_flags |= SB_SEL; SOCKBUF_UNLOCK(&so->so_snd); } |