BlockingSpscProducer

Struct BlockingSpscProducer 

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

Blocking producer for SPSC queue.

This type provides blocking send operations that park the thread until space is available. It shares the same waker infrastructure as AsyncSpscProducer, allowing blocking and async operations to interoperate seamlessly.

§Interoperability

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

§Example

// Create mixed queue: blocking producer, async consumer
let (blocking_producer, async_consumer) = new_blocking_async_spsc(signal);

// Producer thread (blocking)
std::thread::spawn(move || {
    blocking_producer.send(42).unwrap();
});

// Consumer task (async)
maniac::spawn(async move {
    let item = async_consumer.recv().await.unwrap();
});

Implementations§

Source§

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

Source

pub fn capacity(&self) -> usize

Capacity of the underlying queue.

Source

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

Fast-path send without blocking.

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

Source

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

Blocking send that parks the thread until space is available.

Uses efficient thread parking (no busy-waiting). The thread will be unparked when the consumer (async or blocking) frees up space.

§Correctness

Uses the double-check pattern to prevent missed wakeups:

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

pub fn send_slice(&self, values: &mut Vec<T>) -> Result<(), PushError<()>>

Blocking send of a Vec.

Makes progress whenever space is available. Items are moved out of the Vec using move semantics. More efficient than calling send() in a loop due to bulk operations.

On return, the Vec will be empty if all items were sent, or contain only the items that were not sent (if the channel closed).

Source

pub fn close(&mut self)

Closes the queue and wakes any waiters.

Auto Trait Implementations§

§

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

§

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

§

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

§

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

§

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

§

impl<T, const P: usize, const NUM_SEGS_P2: usize> !UnwindSafe for BlockingSpscProducer<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