SynQueue

Struct SynQueue 

Source
pub struct SynQueue<T> { /* private fields */ }
Expand description

Fast internally syncrhonized MPMC queue.

§Principle

The basic problem with MPMC queues on arrays is synchronizing access to data with shifting of head/tail pointers. To address this, a general solution (you can find in crossbeam-queue and others) is to add one atomic bit per element, which serves as a barrier for advancing the queue pointers.

SynQueue tries a different approach. There is no extra bits. Instead, we are keeping 2 representations of the queue state: wide and narrow. Pushing advances wide.head, writes the data, and then makes narrow.head to catch up. Popping advances narrow.tail, reads the data, and then makes wide.tail to catch up. Every operation is thus sequence of CAS loop, data operation, another CAS loop.

§Internal invariants.

Considering an infinite sequence (without wraparounds): wide.tail <= narrow.tail <= narrow.head <= wide.head

Implementations§

Source§

impl<T> SynQueue<T>

Source

pub fn new(capacity: usize) -> Self

Source

pub fn push(&self, value: T) -> Result<(), T>

Source

pub fn pop(&self) -> Option<T>

Trait Implementations§

Source§

impl<T> Drop for SynQueue<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> Sync for SynQueue<T>

Auto Trait Implementations§

§

impl<T> !Freeze for SynQueue<T>

§

impl<T> !RefUnwindSafe for SynQueue<T>

§

impl<T> Send for SynQueue<T>
where T: Send,

§

impl<T> Unpin for SynQueue<T>

§

impl<T> UnwindSafe for SynQueue<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, 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.