SELECT(9) | Kernel Developer's Manual | SELECT(9)

# 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)

May 13, 2008 | NetBSD 9.0