seldrain
, selrecord
,
selwakeup
—
record and wakeup select requests
#include <sys/param.h>
#include <sys/selinfo.h>
void
seldrain
(struct
selinfo *sip);
void
selrecord
(struct
thread *td, struct
selinfo *sip);
void
selwakeup
(struct
selinfo *sip);
seldrain
(), selrecord
() and
selwakeup
() are the three central functions used by
select(2),
poll(2) and
the objects that are being selected on. They handle the task of recording
which threads are waiting on which objects and the waking of the proper
threads when an event of interest occurs on an object.
selrecord
() records that the calling
thread is interested in events related to a given object. If another thread
is already waiting on the object a collision will be flagged in
sip which will be later dealt with by
selwakeup
().
selrecord
() acquires and releases
sellock.
selwakeup
() is called by the underlying
object handling code in order to notify any waiting threads that an event of
interest has occurred. If a collision has occurred,
selwakeup
() will increment
nselcoll, and broadcast on the global cv in order to
wake all waiting threads so that they can handle it. If the thread waiting
on the object is not currently sleeping or the wait channel is not
selwait, selwakeup
() will
clear the TDF_SELECT
flag which should be noted by
select(2)
and
poll(2)
when they wake up.
seldrain
() will flush the waiters queue on
a specified object before its destruction. The object handling code must
ensure that *sip cannot be used once
seldrain
() has been called.
The contents of *sip must be zeroed, such as
by softc initialization, before any call to
selrecord
() or selwakeup
(),
otherwise a panic may occur. selwakeup
() acquires
and releases sellock and may acquire and release
sched_lock. seldrain
() could
usually be just a wrapper for selwakeup
(), but
consumers should not generally rely on this feature.