---
name: "selrecord"
section: "9freebsd"
platform: "linux"
package: "freebsd-manpages"
version: "12.2-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/seldrain/9freebsd"
---

# selrecord(9freebsd)

record and wakeup select requests

Part of [seldrain(9freebsd)](/seldrain/9freebsd.md).

## NAME

**seldrain**, **selrecord**, **selwakeup** – record and wakeup select requests

## SYNOPSIS

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

## DESCRIPTION

**seldrain**(), **selrecord**() and **selwakeup**() are the three central functions used by [select(2)](/select/2.md), [poll(2)](/poll/2.md) 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)](/select/2.md) and [poll(2)](/poll/2.md) 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.

## SEE ALSO

[poll(2)](/poll/2.md), [select(2)](/select/2.md)

## AUTHORS

This manual page was written by Chad David ⟨*davidc@FreeBSD.org*⟩ and Alfred Perlstein ⟨*alfred@FreeBSD.org*⟩.
