aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2004-06-24 00:54:26 +0000
committerRobert Watson <rwatson@FreeBSD.org>2004-06-24 00:54:26 +0000
commitadb4cf0fbcc101a8e3c0b39ccab53a7474472fbb (patch)
tree68c6cda2ee73f6a54d0790bf313278aae6cb17c6 /sys/kern/uipc_socket.c
parent80f0e4c2650ea46a807d697b768eb6599231a179 (diff)
downloadsrc-adb4cf0fbcc101a8e3c0b39ccab53a7474472fbb.tar.gz
src-adb4cf0fbcc101a8e3c0b39ccab53a7474472fbb.zip
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.
Notes
Notes: svn path=/head/; revision=131005
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 5a7e4a309340..fe99fe743588 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);
}