Crates.io | spsc-bip-buffer |
lib.rs | spsc-bip-buffer |
version | 0.2.1 |
source | src |
created_at | 2019-01-05 13:08:25.564966 |
updated_at | 2019-06-12 11:31:13.860069 |
description | A concurrent, spsc ring-buffer with sized reservations |
homepage | |
repository | https://github.com/utaal/spsc-bip-buffer |
max_upload_size | |
id | 105641 |
size | 42,238 |
x86 | arm64 |
---|---|
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.
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: