pub struct ParkedRingEventFd { /* private fields */ }Expand description
Readiness for a ring whose publishers wake only parked readers.
RingEventFd’s driver parks on the generation again as soon as it has
marked its fd readable, so a publisher cannot tell a busy reader from an
idle one and must wake on every publish: one syscall per frame, and one
driver wake and fd signal on the reading side. This driver instead waits
for its consumer to drain before it parks again, and
counts itself in the ring header while it is parked. A publisher using
Fleet::publish_notified_parked
reads that count and wakes only when it is non-zero — under load the
reader is busy draining and publishing costs no syscall at all.
Every reader of a ring published with the parked variant must use this
type: a RingEventFd driver does not count itself and would not be
woken. Rings published with Fleet::publish_notified
are unaffected by this type’s existence.
The contract is RingEventFd’s plus one step: drain the fd, then poll
the ring through your own cursor. Draining is what lets the driver park.
Clear the reactor’s readiness before draining, not after. The driver
signals once per drain: a signal that arrives just after drain
is the only one until the next drain, and a reactor that clears readiness
after draining (tokio’s clear_ready) erases it — the consumer then waits
for an edge that never comes, and the driver for a drain that never
happens. RingEventFd tolerates either order because its driver
signals on every publish.