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,
}
mpmc_channel
#126840)Expand description
Bounded channel based on a preallocated array.
Fields§
§head: CachePadded<Atomic<usize>>
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>>
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>]>
mpmc_channel
#126840)The buffer holding slots.
cap: usize
mpmc_channel
#126840)The channel capacity.
one_lap: usize
mpmc_channel
#126840)A stamp with the value of { lap: 1, mark: 0, index: 0 }
.
mark_bit: usize
mpmc_channel
#126840)If this bit is set in the tail, that means the channel is disconnected.
senders: SyncWaker
mpmc_channel
#126840)Senders waiting while the channel is full.
receivers: SyncWaker
mpmc_channel
#126840)Receivers waiting while the channel is empty and not disconnected.
Implementations§
Source§impl<T> Channel<T>
impl<T> Channel<T>
Sourcepub(crate) fn with_capacity(cap: usize) -> Self
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn with_capacity(cap: usize) -> Self
mpmc_channel
#126840)Creates a bounded channel of capacity cap
.
Sourcefn start_send(&self, token: &mut Token) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
fn start_send(&self, token: &mut Token) -> bool
mpmc_channel
#126840)Attempts to reserve a slot for sending a message.
Sourcepub(crate) unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T>
mpmc_channel
#126840)Writes a message into the channel.
Sourcefn start_recv(&self, token: &mut Token) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
fn start_recv(&self, token: &mut Token) -> bool
mpmc_channel
#126840)Attempts to reserve a slot for receiving a message.
Sourcepub(crate) unsafe fn read(&self, token: &mut Token) -> Result<T, ()>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) unsafe fn read(&self, token: &mut Token) -> Result<T, ()>
mpmc_channel
#126840)Reads a message from the channel.
Sourcepub(crate) fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
mpmc_channel
#126840)Attempts to send a message into the channel.
Sourcepub(crate) fn send(
&self,
msg: T,
deadline: Option<Instant>,
) -> Result<(), SendTimeoutError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn send( &self, msg: T, deadline: Option<Instant>, ) -> Result<(), SendTimeoutError<T>>
mpmc_channel
#126840)Sends a message into the channel.
Sourcepub(crate) fn try_recv(&self) -> Result<T, TryRecvError>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn try_recv(&self) -> Result<T, TryRecvError>
mpmc_channel
#126840)Attempts to receive a message without blocking.
Sourcepub(crate) fn recv(
&self,
deadline: Option<Instant>,
) -> Result<T, RecvTimeoutError>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn recv( &self, deadline: Option<Instant>, ) -> Result<T, RecvTimeoutError>
mpmc_channel
#126840)Receives a message from the channel.
Sourcepub(crate) fn len(&self) -> usize
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn len(&self) -> usize
mpmc_channel
#126840)Returns the current number of messages inside the channel.
Sourcepub(crate) fn capacity(&self) -> Option<usize>
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn capacity(&self) -> Option<usize>
mpmc_channel
#126840)Returns the capacity of the channel.
Sourcepub(crate) fn disconnect_senders(&self) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn disconnect_senders(&self) -> bool
mpmc_channel
#126840)Disconnects senders and wakes up all blocked receivers.
Returns true
if this call disconnected the channel.
Sourcepub(crate) unsafe fn disconnect_receivers(&self) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) unsafe fn disconnect_receivers(&self) -> bool
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.
Sourceunsafe fn discard_all_messages(&self, tail: usize)
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
unsafe fn discard_all_messages(&self, tail: usize)
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.
Sourcepub(crate) fn is_disconnected(&self) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel
#126840)
pub(crate) fn is_disconnected(&self) -> bool
mpmc_channel
#126840)Returns true
if the channel is disconnected.
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)] const IS_ZST: bool = _
#[doc(hidden)] const IS_ZST: bool = _
sized_type_properties
)Source§#[doc(hidden)] const LAYOUT: Layout = _
#[doc(hidden)] const LAYOUT: Layout = _
sized_type_properties
)Source§#[doc(hidden)] const MAX_SLICE_LEN: usize = _
#[doc(hidden)] const MAX_SLICE_LEN: usize = _
sized_type_properties
)[Self]
. Read more