summaryrefslogtreecommitdiffstats
path: root/sys/sys/selinfo.h
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/sys/selinfo.h
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/sys/selinfo.h')
-rw-r--r--sys/sys/selinfo.h16
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/sys/selinfo.h b/sys/sys/selinfo.h
index 946da8c..2d2f848 100644
--- a/sys/sys/selinfo.h
+++ b/sys/sys/selinfo.h
@@ -35,26 +35,26 @@
#include <sys/event.h> /* for struct klist */
+struct selfd;
+TAILQ_HEAD(selfdlist, selfd);
+
/*
* Used to maintain information about processes that wish to be
* notified when I/O becomes possible.
*/
struct selinfo {
- TAILQ_ENTRY(selinfo) si_thrlist; /* list hung off of thread */
- struct thread *si_thread; /* thread waiting */
- struct knlist si_note; /* kernel note list */
- short si_flags; /* see below */
+ struct selfdlist si_tdlist; /* List of sleeping threads. */
+ struct knlist si_note; /* kernel note list */
+ struct mtx *si_mtx; /* Lock for tdlist. */
};
-#define SI_COLL 0x0001 /* collision occurred */
-#define SEL_WAITING(si) \
- ((si)->si_thread != NULL || ((si)->si_flags & SI_COLL) != 0)
+#define SEL_WAITING(si) (!TAILQ_EMPTY(&(si)->si_tdlist))
#ifdef _KERNEL
-void clear_selinfo_list(struct thread *td);
void selrecord(struct thread *selector, struct selinfo *sip);
void selwakeup(struct selinfo *sip);
void selwakeuppri(struct selinfo *sip, int pri);
+void seltdfini(struct thread *td);
#endif
#endif /* !_SYS_SELINFO_H_ */
OpenPOWER on IntegriCloud