{ use Fcntl qw(:flock); my %h; my $size=5; sub ringopen { open(F, ">ring.lock") || die; flock(F, LOCK_EX); dbmopen(%h, "ring", 0666) || die; } sub ringclose { dbmclose(%h); close(F); } sub ringadd { ringopen(); local $_=$h{next}; delete $h{$_-$size} if (defined $_); $h{$h{next}++}=$_[0]; ringclose(); } sub ringdump { ringopen(); my @a=sort { $a <=> $b } grep /^\d+$/, keys %h; @a=@h{@a}; ringclose(); return @a; } }