| SELECT(9) | Kernel Developer's Manual | SELECT(9) |
seldestroy,
selinit, selrecord,
selnotify — select and poll
subsystem
#include
<sys/param.h>
#include <sys/select.h>
void
seldestroy(struct
selinfo *sip);
void
selinit(struct
selinfo *sip);
void
selrecord(struct
lwp *selector, struct
selinfo *sip);
void
selnotify(struct
selinfo *sip, int
events, long
knhint);
selinit()
and
seldestroy()
functions must be used to initialize and destroy the struct
selinfo. The seldestroy() function may
block.
selrecord()
and selnotify() are used by device drivers to
coordinate with the kernel implementation of
select(2) and
poll(2). Each object that can be
polled contains a selinfo record. Device drivers
provide locking for the selinfo record.
selrecord()
records that the calling thread is interested in events related to a given
object. selrecord() should only be called when the
poll routine determines that the object is not ready for I/O: there are no
events of interest pending. The check for pending I/O and call to
selrecord() must be atomic. Atomicity can be
provided by holding the object's lock across the test and call to
selrecord(). For non-MPSAFE drivers, the global
kernel_lock is enough to provide atomicity.
selnotify()
is called by the underlying object handling code in order to notify any
waiting threads that an event of interest has occurred. The same lock held
across the poll method and call to selrecord() must
be held across the call to selnotify(). The lock
prevents an event of interest being signalled while a thread is in the
process of recording its interest.
The events indicates which event happen. Zero may be used if unknown.
selnotify()
also calls
KNOTE()
passing knhint as an argument.
The core of the select and poll subsystem implementation is in sys/kern/sys_select.c. Data structures and function prototypes are located in sys/sys/select.h, sys/sys/poll.h and sys/sys/selinfo.h.
| May 13, 2008 | NetBSD 11.0 |