triple_buf_64 0.1.0

A cheap lock-free triple buffer data structure that stores 64 bits of data
Documentation

triple_buf_64

Documentation Crates.io License NO AI

A cheap realtime-safe lock-free triple buffer data structure that stores 64 bits of data

On platforms which natively support 64 bit atomics, this is implemented with a single cheap AtomicU64 load/store operation (this can optionally use portable_atomic for maximum compatibility).

On platforms which do NOT natively support 64 bit atomics, this is implemented using a more expensive triple buffer implementation (using triple_buffer).

This can be useful when you want to pass a small amount of data between realtime threads (i.e. audio threads) very cheaply on most platforms, but also have a realtime-safe fallback for platforms which do not have 64 bit atomics (i.e. PowerPC).

This crate is no_std compatible and is implemented with zero unsafe code.

Example

// Construct an input/output pair with the given 64 bit type.
let (mut input, mut output) = triple_buffer_64::<i64>(-3);

// The output will read the initial value.
assert_eq!(output.read(), -3);
assert_eq!(output.read(), -3);

// Write new data into the buffer.
input.write(-9845);

assert_eq!(output.read(), -9845);
assert_eq!(output.read(), -9845);

input.write(69);
input.write(68);
input.write(67);

// The output always reads the latest value that was pushed to the buffer.
assert_eq!(output.read(), 67);
assert_eq!(output.read(), 67);

Data Types

This triple buffer accepts any data type that implements the [Data64Bit] trait. Implementations for the following primitives are provided:

  • u64
  • i64
  • f64
  • [u32; 2]
  • [i32; 2]
  • [f32; 2]
  • [u16; 4]
  • [i16; 4]
  • [u8; 8]
  • [i8; 8]
  • [bool; 8]

Crate Features

  • portable-atomic - (disabled by default) - Enables the use of the portable_atomic crate for maximum 64 bit atomic compatibility.

License

Licensed under either of

at your option.