BlockingSpscConsumer

Struct BlockingSpscConsumer 

Source
pub struct BlockingSpscConsumer<T, const P: usize, const NUM_SEGS_P2: usize> { /* private fields */ }
Expand description

Blocking consumer for SPSC queue.

This type provides blocking receive operations that park the thread until items are available. It shares the same waker infrastructure as AsyncSpscConsumer, allowing blocking and async operations to interoperate seamlessly.

§Interoperability

A BlockingSpscConsumer can wake up an AsyncSpscProducer and vice versa. This allows mixing blocking threads with async tasks in the same queue.

§Example

// Create mixed queue: async producer, blocking consumer
let (async_producer, blocking_consumer) = new_async_blocking_spsc(signal);

// Producer task (async)
maniac::spawn(async move {
    async_producer.send(42).await.unwrap();
});

// Consumer thread (blocking)
std::thread::spawn(move || {
    let item = blocking_consumer.recv().unwrap();
});

Implementations§

Source§

impl<T, const P: usize, const NUM_SEGS_P2: usize> BlockingSpscConsumer<T, P, NUM_SEGS_P2>

Source

pub fn capacity(&self) -> usize

Capacity of the underlying queue.

Source

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

Fast-path receive without blocking.

Returns immediately with success or error. Does not block the thread.

Source

pub fn recv(&self) -> Result<T, PopError>

Blocking receive that parks the thread until an item is available.

Uses efficient thread parking (no busy-waiting). The thread will be unparked when the producer (async or blocking) sends an item.

§Correctness

Uses the double-check pattern to prevent missed wakeups:

  1. Try to receive
  2. Register waker if empty
  3. Double-check after registering (catches races)
  4. Park if still empty
§Performance
  • Fast path (item available): ~5-15ns
  • Blocking path: Efficient thread parking (no spinning)
Source

pub fn recv_batch(&self, dst: &mut [T]) -> Result<usize, PopError>

Blocking receive of multiple items.

Receives up to dst.len() items, blocking until at least one is available. Returns the number of items actually received.

Auto Trait Implementations§

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> Freeze for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> !RefUnwindSafe for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> Send for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> Sync for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> Unpin for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> !UnwindSafe for BlockingSpscConsumer<T, P, NUM_SEGS_P2>

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V