Struct crossbeam_channel::flavors::array::Channel
source · 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>
impl<T> Channel<T>
sourcepub(crate) fn with_capacity(cap: usize) -> Self
pub(crate) fn with_capacity(cap: usize) -> Self
Creates a bounded channel of capacity cap
.
sourcefn start_send(&self, token: &mut Token) -> bool
fn start_send(&self, token: &mut Token) -> bool
Attempts to reserve a slot for sending a message.
sourcepub(crate) unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T>
pub(crate) unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T>
Writes a message into the channel.
sourcefn start_recv(&self, token: &mut Token) -> bool
fn start_recv(&self, token: &mut Token) -> bool
Attempts to reserve a slot for receiving a message.
sourcepub(crate) unsafe fn read(&self, token: &mut Token) -> Result<T, ()>
pub(crate) unsafe fn read(&self, token: &mut Token) -> Result<T, ()>
Reads a message from the channel.
sourcepub(crate) fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
pub(crate) fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
Attempts to send a message into the channel.
sourcepub(crate) fn send(
&self,
msg: T,
deadline: Option<Instant>,
) -> Result<(), SendTimeoutError<T>>
pub(crate) fn send( &self, msg: T, deadline: Option<Instant>, ) -> Result<(), SendTimeoutError<T>>
Sends a message into the channel.
sourcepub(crate) fn try_recv(&self) -> Result<T, TryRecvError>
pub(crate) fn try_recv(&self) -> Result<T, TryRecvError>
Attempts to receive a message without blocking.
sourcepub(crate) fn recv(
&self,
deadline: Option<Instant>,
) -> Result<T, RecvTimeoutError>
pub(crate) fn recv( &self, deadline: Option<Instant>, ) -> Result<T, RecvTimeoutError>
Receives a message from the channel.
sourcepub(crate) fn disconnect(&self) -> bool
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.
sourcepub(crate) fn is_disconnected(&self) -> bool
pub(crate) fn is_disconnected(&self) -> bool
Returns true
if the channel is disconnected.