spsc-bip-buffer 0.2.1

A concurrent, spsc ring-buffer with sized reservations


Crates.io Docs

x86 arm64
Build Status Build Status

spsc-bip-buffer is a single-producer single-consumer circular buffer that always supports writing a contiguous chunk of data. Write requests that cannot fit in an available contiguous area will wait till space is newly available (after the consumer has read the data).

spsc-bip-buffer is lock-free and uses atomics for coordination.

Here's a simple example:

use spsc_bip_buffer::bip_buffer_with_len;
let (mut writer, mut reader) = bip_buffer_with_len(256);
let sender = std::thread::spawn(move || {
    for i in 0..128 {
        let mut reservation = writer.spin_reserve(8);
        reservation.copy_from_slice(&[10, 11, 12, 13, 14, 15, 16, i]);
        reservation.send(); // optional, dropping has the same effect
let receiver = std::thread::spawn(move || {
    for i in 0..128 {
        while reader.valid().len() < 8 {}
        assert_eq!(&reader.valid()[..8], &[10, 11, 12, 13, 14, 15, 16, i]);

Usage documentation is at docs.rs/spsc-bip-buffer.

spsc-bip-buffer is inspired by this article on codeproject and was designed with James Munns during a long night at 35c3. Have a look at his #[no_std] implementation: jamesmunns/bbqueue.


spsc-bip-buffer = "..."


As of e2a9fa8, on a Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, it achieves 12.5M sends/sec and 3.2 GB/s with 255-byte long messages sent between two separate physical cores (see the examples/perf.rs experiment).


Licensed under your choice of: