Struct bbqueue::BBBuffer

source ·
pub struct BBBuffer<const N: usize> { /* private fields */ }
Expand description

A backing structure for a BBQueue. Can be used to create either a BBQueue or a split Producer/Consumer pair

Implementations§

source§

impl<'a, const N: usize> BBBuffer<N>

source

pub fn try_split(&'a self) -> Result<(Producer<'a, N>, Consumer<'a, N>)>

Attempt to split the BBBuffer into Consumer and Producer halves to gain access to the buffer. If buffer has already been split, an error will be returned.

NOTE: When splitting, the underlying buffer will be explicitly initialized to zero. This may take a measurable amount of time, depending on the size of the buffer. This is necessary to prevent undefined behavior. If the buffer is placed at static scope within the .bss region, the explicit initialization will be elided (as it is already performed as part of memory initialization)

NOTE: If the thumbv6 feature is selected, this function takes a short critical section while splitting.

use bbqueue::BBBuffer;

// Create and split a new buffer
let buffer: BBBuffer<6> = BBBuffer::new();
let (prod, cons) = buffer.try_split().unwrap();

// Not possible to split twice
assert!(buffer.try_split().is_err());
source

pub fn try_split_framed( &'a self ) -> Result<(FrameProducer<'a, N>, FrameConsumer<'a, N>)>

Attempt to split the BBBuffer into FrameConsumer and FrameProducer halves to gain access to the buffer. If buffer has already been split, an error will be returned.

NOTE: When splitting, the underlying buffer will be explicitly initialized to zero. This may take a measurable amount of time, depending on the size of the buffer. This is necessary to prevent undefined behavior. If the buffer is placed at static scope within the .bss region, the explicit initialization will be elided (as it is already performed as part of memory initialization)

NOTE: If the thumbv6 feature is selected, this function takes a short critical section while splitting.

source

pub fn try_release( &'a self, prod: Producer<'a, N>, cons: Consumer<'a, N> ) -> CoreResult<(), (Producer<'a, N>, Consumer<'a, N>)>

Attempt to release the Producer and Consumer

This re-initializes the buffer so it may be split in a different mode at a later time. There must be no read or write grants active, or an error will be returned.

The Producer and Consumer must be from THIS BBBuffer, or an error will be returned.

use bbqueue::BBBuffer;

// Create and split a new buffer
let buffer: BBBuffer<6> = BBBuffer::new();
let (prod, cons) = buffer.try_split().unwrap();

// Not possible to split twice
assert!(buffer.try_split().is_err());

// Release the producer and consumer
assert!(buffer.try_release(prod, cons).is_ok());

// Split the buffer in framed mode
let (fprod, fcons) = buffer.try_split_framed().unwrap();
source

pub fn try_release_framed( &'a self, prod: FrameProducer<'a, N>, cons: FrameConsumer<'a, N> ) -> CoreResult<(), (FrameProducer<'a, N>, FrameConsumer<'a, N>)>

Attempt to release the Producer and Consumer in Framed mode

This re-initializes the buffer so it may be split in a different mode at a later time. There must be no read or write grants active, or an error will be returned.

The FrameProducer and FrameConsumer must be from THIS BBBuffer, or an error will be returned.

source§

impl<const A: usize> BBBuffer<A>

source

pub const fn new() -> Self

Create a new constant inner portion of a BBBuffer.

NOTE: This is only necessary to use when creating a BBBuffer at static scope, and is generally never used directly. This process is necessary to work around current limitations in const fn, and will be replaced in the future.

use bbqueue::BBBuffer;

static BUF: BBBuffer<6> = BBBuffer::new();

fn main() {
   let (prod, cons) = BUF.try_split().unwrap();
}
source§

impl<const N: usize> BBBuffer<N>

source

pub const fn capacity(&self) -> usize

Returns the size of the backing storage.

This is the maximum number of bytes that can be stored in this queue.

use bbqueue::BBBuffer;

// Create a new buffer of 6 elements
let buffer: BBBuffer<6> = BBBuffer::new();
assert_eq!(buffer.capacity(), 6);

Trait Implementations§

source§

impl<const N: usize> Debug for BBBuffer<N>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<const A: usize> Sync for BBBuffer<A>

Auto Trait Implementations§

§

impl<const N: usize> !Freeze for BBBuffer<N>

§

impl<const N: usize> !RefUnwindSafe for BBBuffer<N>

§

impl<const N: usize> Send for BBBuffer<N>

§

impl<const N: usize> Unpin for BBBuffer<N>

§

impl<const N: usize> UnwindSafe for BBBuffer<N>

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>,

§

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>,

§

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.