SELRECORD(9) | Kernel Developer's Manual | SELRECORD(9) |
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.
This manual page was written by Chad David <davidc@FreeBSD.org> and Alfred Perlstein <alfred@FreeBSD.org>.
August 25, 2011 | Debian |