NAME Data::RingBuffer::Shared - Shared-memory fixed-size ring buffer for Linux SYNOPSIS use Data::RingBuffer::Shared; my $ring = Data::RingBuffer::Shared::Int->new(undef, 100); $ring->write(42); $ring->write(99); say $ring->latest; # 99 (most recent) say $ring->latest(1); # 42 (previous) say $ring->size; # 2 # overwrites oldest when full — never blocks $ring->write($_) for 1..200; say $ring->size; # 100 (capacity) say $ring->latest; # 200 # read by sequence number my $seq = $ring->write(777); say $ring->read_seq($seq); # 777 # wait for new data my $cnt = $ring->count; $ring->wait_for($cnt, 5.0); # F64 variant my $f = Data::RingBuffer::Shared::F64->new(undef, 1000); $f->write(3.14); # dump entire ring as list (oldest first) my @vals = $ring->to_list; DESCRIPTION Fixed-size circular buffer in shared memory. Writes overwrite the oldest entry when the buffer is full — writes never block or fail. Readers access data by relative position (0=latest) or absolute sequence number. Unlike Data::Queue::Shared (consumed on read, blocks when full) and Data::PubSub::Shared (subscription tracking), RingBuffer is a simple overwriting window with no consumer state. Useful for metrics rings, sensor data, rolling windows, debug traces. Linux-only. Requires 64-bit Perl. Variants "Data::RingBuffer::Shared::Int" - int64_t values "Data::RingBuffer::Shared::F64" - double values METHODS Constructors $r = Data::RingBuffer::Shared::Int->new($path, $capacity); $r = Data::RingBuffer::Shared::Int->new(undef, $capacity); $r = Data::RingBuffer::Shared::Int->new_memfd($name, $cap); $r = Data::RingBuffer::Shared::Int->new_from_fd($fd); Write my $seq = $ring->write($value); # returns sequence number Always succeeds. Overwrites oldest when full. Read my $val = $ring->latest; # most recent (undef if empty) my $val = $ring->latest($n); # nth most recent (0=latest) my $val = $ring->read_seq($s); # by sequence (undef if overwritten) my @all = $ring->to_list; # entire ring, oldest first Status $ring->size; # entries in buffer (max = capacity) $ring->capacity; $ring->head; # next write position (monotonic) $ring->count; # total writes (for wait_for) Waiting my $ok = $ring->wait_for($expected_count); # block until count changes my $ok = $ring->wait_for($expected_count, $timeout); Returns 1 if new data arrived (count != expected), 0 on timeout. Lifecycle $ring->clear; # reset head/count (NOT concurrency-safe) $ring->sync; $ring->unlink; $ring->path; $ring->memfd; $ring->stats; eventfd $ring->eventfd; $ring->eventfd_set($fd); $ring->fileno; $ring->notify; $ring->eventfd_consume; BENCHMARKS Single-process (1M ops, x86_64 Linux, Perl 5.40, cap=1000): Int write 11.7M/s Int latest 11.1M/s Int read_seq 10.4M/s F64 write 8.8M/s F64 latest 12.0M/s STATS stats() returns a hashref: "size", "capacity", "head", "count", "writes", "overwrites", "mmap_size". SECURITY The mmap region is writable by all processes that open it. Do not share backing files with untrusted processes. SEE ALSO Data::Queue::Shared - FIFO queue (consumed on read) Data::PubSub::Shared - publish-subscribe ring (subscription tracking) Data::Buffer::Shared - typed shared array Data::BitSet::Shared - shared bitset Data::Pool::Shared - fixed-size object pool Data::Stack::Shared - LIFO stack Data::Deque::Shared - double-ended queue Data::Log::Shared - append-only log Data::Heap::Shared - priority queue Data::Graph::Shared - directed weighted graph Data::Sync::Shared - synchronization primitives Data::HashMap::Shared - concurrent hash table Data::ReqRep::Shared - request-reply AUTHOR vividsnow LICENSE Same terms as Perl itself.