Skip to main content

ParkedRingEventFd

Struct ParkedRingEventFd 

Source
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.

Implementations§

Source§

impl ParkedRingEventFd

Source

pub fn drain(&self) -> Result<u64>

Drain the fd and let the driver park again. Poll the ring after this.

Trait Implementations§

Source§

impl AsFd for ParkedRingEventFd

Source§

fn as_fd(&self) -> BorrowedFd<'_>

Borrows the file descriptor. Read more
Source§

impl AsRawFd for ParkedRingEventFd

Source§

fn as_raw_fd(&self) -> RawFd

Extracts the raw file descriptor. Read more
Source§

impl Debug for ParkedRingEventFd

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for ParkedRingEventFd

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.