rusted-ring
A high-performance, cache-optimized ring buffer library for Rust, designed for lock-free, multi-reader, single-writer scenarios with zero-allocation event processing.
Features
- Cache-line aligned ring buffers for optimal CPU cache performance
- Lock-free operations using atomic memory ordering
- T-shirt sized pools for different event categories
- Zero-copy operations with Pod/Zeroable support
- Mobile optimized for ARM and x86 architectures
- Single-writer, multi-reader design inspired by LMAX Disruptor
Quick Start
use ;
// Create a ring buffer for 256-byte events with 1000 capacity
let ring = new;
// Create writer and readers
let mut writer = Writer ;
let mut reader = Reader ;
// Write events
let event = zeroed;
writer.add;
// Read events
while let Some = reader.next
Core Types
RingBuffer<const TSHIRT_SIZE: usize, const RING_CAPACITY: usize>
The main ring buffer structure. Cache-aligned and optimized for high-frequency access.
let ring = new; // 1KB events, 500 capacity
PooledEvent
Fixed-size event structure that implements Pod and Zeroable for zero-copy operations.
Writer<const TSHIRT_SIZE: usize, const RING_CAPACITY: usize>
Single-writer interface for adding events to the ring buffer.
let mut writer = Writer ;
// Add events with proper memory ordering
writer.add;
Reader<const TSHIRT_SIZE: usize, const RING_CAPACITY: usize>
Multi-reader interface implementing Iterator for consuming events.
let mut reader = Reader ;
// Iterate over available events
for event in reader
T-Shirt Sizing
Pre-defined event sizes for optimal memory usage:
EventPools
Manage multiple ring buffers by size category:
use EventPools;
let pools = new;
// Get appropriately sized writers
let xs_writer = pools.get_xs_writer; // 64-byte events
let s_writer = pools.get_s_writer; // 256-byte events
let m_writer = pools.get_m_writer; // 1KB events
let l_writer = pools.get_l_writer; // 4KB events
let xl_writer = pools.get_xl_writer; // 16KB events
// Get readers for each size
let xs_reader = pools.get_xs_reader;
let s_reader = pools.get_s_reader;
// ... etc
Memory Ordering & Safety
The library uses careful memory ordering to ensure data visibility:
- Writers: Use
Releaseordering when updating cursors - Readers: Use
Acquireordering when reading cursor positions - Data access: Protected by cursor coordination
This ensures readers never see stale data while maintaining lock-free performance.
Cache Optimization
All structures are cache-line aligned (64 bytes) to prevent false sharing:
Performance Characteristics
- Allocation: Zero allocations after initialization
- Write latency: ~10-50ns per event
- Read latency: ~5-20ns per event
- Memory usage: Predictable and bounded
- Cache performance: Optimized for sequential access patterns
Use Cases
Perfect for:
- Real-time systems requiring predictable latency
- High-frequency event processing (trading, gaming, IoT)
- Mobile applications with strict memory constraints
- P2P systems needing efficient local buffering
- CRDT operations and collaborative editing
Example: Event Processing Pipeline
use Arc;
use ;
// Initialize pools
let pools = new;
// Producer thread
let pools_producer = pools.clone;
spawn;
// Consumer thread
let pools_consumer = pools.clone;
spawn;
Memory Requirements
Approximate memory usage for default pool configurations:
- XS Pool: 64 × 2000 = 128KB
- S Pool: 256 × 1000 = 256KB
- M Pool: 1024 × 500 = 512KB
- L Pool: 4096 × 200 = 819KB
- XL Pool: 16384 × 50 = 819KB
Total: ~2.5MB of pre-allocated ring buffer memory
License
Licensed under either of
- Apache License, Version 2.0
- MIT License
at your option.