Struct Channel

Source
pub(crate) struct Channel<T> {
    head: CachePadded<Atomic<usize>>,
    tail: CachePadded<Atomic<usize>>,
    buffer: Box<[Slot<T>]>,
    cap: usize,
    one_lap: usize,
    mark_bit: usize,
    senders: SyncWaker,
    receivers: SyncWaker,
}
🔬This is a nightly-only experimental API. (mpmc_channel #126840)
Expand description

Bounded channel based on a preallocated array.

Fields§

§head: CachePadded<Atomic<usize>>
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

The head of the channel.

This value is a “stamp” consisting of an index into the buffer, a mark bit, and a lap, but packed into a single usize. The lower bits represent the index, while the upper bits represent the lap. The mark bit in the head is always zero.

Messages are popped from the head of the channel.

§tail: CachePadded<Atomic<usize>>
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

The tail of the channel.

This value is a “stamp” consisting of an index into the buffer, a mark bit, and a lap, but packed into a single usize. The lower bits represent the index, while the upper bits represent the lap. The mark bit indicates that the channel is disconnected.

Messages are pushed into the tail of the channel.

§buffer: Box<[Slot<T>]>
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

The buffer holding slots.

§cap: usize
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

The channel capacity.

§one_lap: usize
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

A stamp with the value of { lap: 1, mark: 0, index: 0 }.

§mark_bit: usize
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

If this bit is set in the tail, that means the channel is disconnected.

§senders: SyncWaker
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Senders waiting while the channel is full.

§receivers: SyncWaker
🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Receivers waiting while the channel is empty and not disconnected.

Implementations§

Source§

impl<T> Channel<T>

Source

pub(crate) fn with_capacity(cap: usize) -> Self

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Creates a bounded channel of capacity cap.

Source

fn start_send(&self, token: &mut Token) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Attempts to reserve a slot for sending a message.

Source

pub(crate) unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Writes a message into the channel.

Source

fn start_recv(&self, token: &mut Token) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Attempts to reserve a slot for receiving a message.

Source

pub(crate) unsafe fn read(&self, token: &mut Token) -> Result<T, ()>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Reads a message from the channel.

Source

pub(crate) fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Attempts to send a message into the channel.

Source

pub(crate) fn send( &self, msg: T, deadline: Option<Instant>, ) -> Result<(), SendTimeoutError<T>>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Sends a message into the channel.

Source

pub(crate) fn try_recv(&self) -> Result<T, TryRecvError>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Attempts to receive a message without blocking.

Source

pub(crate) fn recv( &self, deadline: Option<Instant>, ) -> Result<T, RecvTimeoutError>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Receives a message from the channel.

Source

pub(crate) fn len(&self) -> usize

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Returns the current number of messages inside the channel.

Source

pub(crate) fn capacity(&self) -> Option<usize>

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Returns the capacity of the channel.

Source

pub(crate) fn disconnect_senders(&self) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Disconnects senders and wakes up all blocked receivers.

Returns true if this call disconnected the channel.

Source

pub(crate) unsafe fn disconnect_receivers(&self) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Disconnects receivers and wakes up all blocked senders.

Returns true if this call disconnected the channel.

§Safety

May only be called once upon dropping the last receiver. The destruction of all other receivers must have been observed with acquire ordering or stronger.

Source

unsafe fn discard_all_messages(&self, tail: usize)

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Discards all messages.

tail should be the current (and therefore last) value of tail.

§Panicking

If a destructor panics, the remaining messages are leaked, matching the behavior of the unbounded channel.

§Safety

This method must only be called when dropping the last receiver. The destruction of all other receivers must have been observed with acquire ordering or stronger.

Source

pub(crate) fn is_disconnected(&self) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Returns true if the channel is disconnected.

Source

pub(crate) fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Returns true if the channel is empty.

Source

pub(crate) fn is_full(&self) -> bool

🔬This is a nightly-only experimental API. (mpmc_channel #126840)

Returns true if the channel is full.

Auto Trait Implementations§

§

impl<T> !Freeze for Channel<T>

§

impl<T> !RefUnwindSafe for Channel<T>

§

impl<T> !Send for Channel<T>

§

impl<T> !Sync for Channel<T>

§

impl<T> Unpin for Channel<T>

§

impl<T> UnwindSafe for Channel<T>
where T: UnwindSafe,

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> SizedTypeProperties for T

Source§

#[doc(hidden)] const IS_ZST: bool = _

🔬This is a nightly-only experimental API. (sized_type_properties)
true if this type requires no storage. false if its size is greater than zero. Read more
Source§

#[doc(hidden)] const LAYOUT: Layout = _

🔬This is a nightly-only experimental API. (sized_type_properties)
Source§

#[doc(hidden)] const MAX_SLICE_LEN: usize = _

🔬This is a nightly-only experimental API. (sized_type_properties)
The largest safe length for a [Self]. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.