NAME
seldestroy,
selinit,
selrecord,
selnotify —
select and poll subsystem
SYNOPSIS
#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);
DESCRIPTION
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.
CODE REFERENCES
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.
SEE ALSO
poll(2),
select(2),
knote(9)