summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_sockbuf.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2007-12-16 06:21:20 +0000
committerjeff <jeff@FreeBSD.org>2007-12-16 06:21:20 +0000
commit4ec9caf00c407884fc51ff18adb8ff16a5eb75c0 (patch)
treee3b97a4fccf98fcc3311ea54b086b57edb1abb4d /sys/kern/uipc_sockbuf.c
parent436e8270ebc964cc1f1effe79ac5c10e92e78f7b (diff)
downloadFreeBSD-src-4ec9caf00c407884fc51ff18adb8ff16a5eb75c0.zip
FreeBSD-src-4ec9caf00c407884fc51ff18adb8ff16a5eb75c0.tar.gz
Refactor select to reduce contention and hide internal implementation
details from consumers. - Track individual selecters on a per-descriptor basis such that there are no longer collisions and after sleeping for events only those descriptors which triggered events must be rescaned. - Protect the selinfo (per descriptor) structure with a mtx pool mutex. mtx pool mutexes were chosen to preserve api compatibility with existing code which does nothing but bzero() to setup selinfo structures. - Use a per-thread wait channel rather than a global wait channel. - Hide select implementation details in a seltd structure which is opaque to the rest of the kernel. - Provide a 'selsocket' interface for those kernel consumers who wish to select on a socket when they have no fd so they no longer have to be aware of select implementation details. Tested by: kris Reviewed on: arch
Diffstat (limited to 'sys/kern/uipc_sockbuf.c')
-rw-r--r--sys/kern/uipc_sockbuf.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c
index e1fc341..aa1d5ce 100644
--- a/sys/kern/uipc_sockbuf.c
+++ b/sys/kern/uipc_sockbuf.c
@@ -176,7 +176,8 @@ sowakeup(struct socket *so, struct sockbuf *sb)
SOCKBUF_LOCK_ASSERT(sb);
selwakeuppri(&sb->sb_sel, PSOCK);
- sb->sb_flags &= ~SB_SEL;
+ if (!SEL_WAITING(&sb->sb_sel))
+ sb->sb_flags &= ~SB_SEL;
if (sb->sb_flags & SB_WAIT) {
sb->sb_flags &= ~SB_WAIT;
wakeup(&sb->sb_cc);
OpenPOWER on IntegriCloud