Skip to main content

RingEventFd

Struct RingEventFd 

Source
pub struct RingEventFd { /* private fields */ }
Expand description

Process-local fd readiness for one shared Orbit ring.

Every subscribing process creates its own instance. A small driver thread parks on the ring’s generation, counting itself in the ring header while it is parked, and marks this fd readable when the generation moves. It then waits for its consumer to drain before it parks again. A publisher using Fleet::publish_notified bumps the generation and wakes only when a driver is parked: while every reader is busy draining, a publish is a write and an atomic, with no syscall. Multiple publishes coalesce into one wake.

The fd is backed by an eventfd on Linux and FreeBSD and by a nonblocking pipe on macOS, where native readiness needs 14.4 or later; older systems return ErrorKind::Unsupported from construction so callers can poll.

The contract: 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.

Implementations§

Source§

impl RingEventFd

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 RingEventFd

Source§

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

Borrows the file descriptor. Read more
Source§

impl AsRawFd for RingEventFd

Source§

fn as_raw_fd(&self) -> RawFd

Extracts the raw file descriptor. Read more
Source§

impl Debug for RingEventFd

Source§

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

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

impl Drop for RingEventFd

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.