summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-06-24 00:54:26 +0000
committerrwatson <rwatson@FreeBSD.org>2004-06-24 00:54:26 +0000
commite71609f557ffc08ae313e1f890e4083c67d7f797 (patch)
tree68c6cda2ee73f6a54d0790bf313278aae6cb17c6
parentab7b1075ef4b1c6ef29f25ba0f7951a3ae6c418f (diff)
downloadFreeBSD-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.c4
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);
}
OpenPOWER on IntegriCloud