pub(crate) struct Channel<T> {
    head: CachePadded<AtomicUsize>,
    tail: CachePadded<AtomicUsize>,
    buffer: Box<[Slot<T>]>,
    cap: usize,
    one_lap: usize,
    mark_bit: usize,
    senders: SyncWaker,
    receivers: SyncWaker,
}
Expand description

Bounded channel based on a preallocated array.

Fields§

§head: CachePadded<AtomicUsize>

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<AtomicUsize>

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>]>

The buffer holding slots.

§cap: usize

The channel capacity.

§one_lap: usize

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

§mark_bit: usize

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

§senders: SyncWaker

Senders waiting while the channel is full.

§receivers: SyncWaker

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

Creates a bounded channel of capacity cap.

source

pub(crate) fn receiver(&self) -> Receiver<'_, T>

Returns a receiver handle to the channel.

source

pub(crate) fn sender(&self) -> Sender<'_, T>

Returns a sender handle to the channel.

source

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

Attempts to reserve a slot for sending a message.

source

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

Writes a message into the channel.

source

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

Attempts to reserve a slot for receiving a message.

source

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

Reads a message from the channel.

source

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

Attempts to send a message into the channel.

source

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

Sends a message into the channel.

source

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

Attempts to receive a message without blocking.

source

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

Receives a message from the channel.

source

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

Returns the current number of messages inside the channel.

source

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

Returns the capacity of the channel.

source

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

Disconnects the channel and wakes up all blocked senders and receivers.

Returns true if this call disconnected the channel.

source

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

Returns true if the channel is disconnected.

source

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

Returns true if the channel is empty.

source

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

Returns true if the channel is full.

Trait Implementations§

source§

impl<T> Drop for Channel<T>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

§

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 Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.