#buffer #circular-buffer #spsc #queue

spsc-bip-buffer

A concurrent, spsc ring-buffer with sized reservations

4 releases

0.2.1 Jun 12, 2019
0.2.0 Jun 12, 2019
0.1.1 Jan 30, 2019
0.1.0 Jan 5, 2019

#1141 in Concurrency

Download history 58/week @ 2024-07-28 8/week @ 2024-08-11 13/week @ 2024-08-18 119/week @ 2024-08-25 118/week @ 2024-09-01 26/week @ 2024-09-08 15/week @ 2024-09-15 189/week @ 2024-09-22 157/week @ 2024-09-29 208/week @ 2024-10-06 68/week @ 2024-10-13 89/week @ 2024-10-20 124/week @ 2024-10-27 160/week @ 2024-11-03

448 downloads per month

MIT/Apache

24KB
371 lines

spsc-bip-buffer

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]);
        reader.consume(8);
    }
});
sender.join().unwrap();
receiver.join().unwrap();

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.

Cargo.toml

spsc-bip-buffer = "..."

Performance

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).

License

Licensed under your choice of:

Dependencies