| Crates.io | loopq |
| lib.rs | loopq |
| version | 0.1.0 |
| created_at | 2026-01-02 16:26:52.74911+00 |
| updated_at | 2026-01-02 16:26:52.74911+00 |
| description | An efficient SPSC lock-free ring buffer with support for no_std, Embassy, and Tokio. |
| homepage | |
| repository | https://github.com/ggriffiniii/loopq |
| max_upload_size | |
| id | 2018853 |
| size | 105,478 |
An efficient, single-producer single-consumer (SPSC) lock-free ring buffer for Rust.
embassy-rs via the embassy feature.tokio via the tokio feature.static contexts.use loopq::Buffer;
fn main() {
let buffer = Buffer::<1024>::new();
let mut producer = buffer.producer();
let mut consumer = buffer.consumer();
// Write data
let mut w = producer.writable_bytes();
w[0] = 42;
w.commit(1);
// Read data
let r = consumer.readable_bytes();
assert_eq!(r[0], 42);
r.consume(1);
}
Enable the tokio feature in your Cargo.toml.
use loopq::tokio::AsyncBuffer;
#[tokio::main]
async fn main() {
let buffer = AsyncBuffer::<1024>::new();
let mut producer = buffer.producer();
let mut consumer = buffer.consumer();
// Producer
tokio::spawn(async move {
let mut w = producer.writable_bytes().await; // Blocks if full
w[0] = 42;
w.commit(1);
});
// Consumer
let r = consumer.readable_bytes().await; // Blocks if empty
assert_eq!(r[0], 42);
r.consume(1);
r.consume(1);
}
loopq is designed for no_std environments and can be statically initialized.
use loopq::Buffer;
static BUFFER: Buffer<1024> = Buffer::new();
fn main() {
// Access the static buffer directly
let mut producer = BUFFER.producer();
let mut consumer = BUFFER.consumer();
// Use producer and consumer as normal
let mut w = producer.writable_bytes();
w[0] = 1;
w.commit(1);
}
Licensed under either of
at your option.