#ring-buffer #shared-memory #lock-free #ipc

shm-primitives

Lock-free primitives for shared memory IPC: SPSC ring buffers and Treiber stack slab allocators

3 releases (breaking)

Uses new Rust 2024

0.6.0 Jan 22, 2026
0.5.0 Dec 21, 2025
0.4.0 Dec 21, 2025

#173 in Concurrency

Download history 6/week @ 2025-12-16 35/week @ 2025-12-23 19/week @ 2025-12-30 20/week @ 2026-01-06 53/week @ 2026-01-13 35/week @ 2026-01-20 8/week @ 2026-01-27 12/week @ 2026-02-03

114 downloads per month
Used in 3 crates (2 directly)

MIT/Apache

130KB
2.5K SLoC

shm-primitives

crates.io documentation MIT/Apache-2.0 licensed

Lock-free primitives for shared memory IPC.

This crate provides lock-free data structures designed for use in shared memory contexts where you work with raw pointers to memory-mapped regions.

Primitives

  • SpscRing / SpscRingRaw: Single-producer single-consumer ring buffer with wait-free operations
  • TreiberSlab / TreiberSlabRaw: Treiber stack-based slab allocator with generation counting for ABA protection

Raw vs Region APIs

Each primitive has two variants:

  • Raw (SpscRingRaw, TreiberSlabRaw): Work with raw pointers, suitable for shared memory where you have *mut pointers from mmap. Caller manages memory lifetime.

  • Region (SpscRing, TreiberSlab): Convenience wrappers that own their backing memory via a Region. These delegate to the Raw implementations internally.

Features

  • loom - Enables loom-based concurrency testing

Loom Testing

All algorithms are tested under loom to verify correctness across all possible thread interleavings:

cargo test -p shm-primitives --features loom

Example

use shm_primitives::{SpscRing, HeapRegion, PushResult};

// Create a ring buffer with capacity 16
let region = HeapRegion::new_zeroed(SpscRing::<u64>::required_size(16));
let ring = SpscRing::<u64>::init(region.region(), 16);

// Split into producer and consumer
let (mut producer, mut consumer) = ring.split();

// Push some values
assert!(matches!(producer.push(42), PushResult::Ok));
assert!(matches!(producer.push(43), PushResult::Ok));

// Pop them back
assert_eq!(consumer.pop(), Some(42));
assert_eq!(consumer.pop(), Some(43));
assert_eq!(consumer.pop(), None);

License

MIT OR Apache-2.0

Dependencies

~7–22MB
~173K SLoC