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.