Revision history for Shared::Arena

0.05	2026-09-11
        - FIXES the build on a C89 compiler, gcc 4.2.1 on the FreeBSD 9 smoker,
          which refused 0.03 and 0.04 with "redefinition of typedef": four
          tenants typedef-named their struct where the ABI header forward
          declares it.i

0.04	2026-09-11
        - Add Shared::Arena::HyperLogLog, how many distinct keys in a few
          kilobytes: an add is a lock-free max, so a pool shares one sketch
          with nothing to contend on, and two sketches merge into their union.
        - ABI version 3.
        - FIXES two smoker FAILs on a two-processor box. t/22-cache.t let
          children churn while a sibling was still reading; they now wait
          until every read is reported. t/08-mpsc.t asserted the READER saw
          several children, which needs the parent scheduled mid-storm; it
          now asserts the children's sequence ranges overlapped.

0.03	2026-09-11
        - Add Shared::Arena::Cuckoo, a shared filter that can remove a key.
        - Add Shared::Arena::Scoreboard, one row per worker published live:
          each worker writes its own row with no lock, a supervisor reads the
          whole board in one pass
        - Add Shared::Arena::Lease, leader election: one holder at a time and
          a successor when the holder dies, with a fencing token.
        - Shared::Arena::Map store takes ttl / ttl_ms, a per-key deadline after
          which the key reads as absent everywhere; expiry is lazy and counted
          in the new `expired` stat, and an expired counter resets on incr.
        - Cache reads scale across processes. A hit wrote a counter every
          process shares; counts are now published every 64. Eight processes
          reading one key: 530ns a get before, 87ns now.
        - A cache get reads the clock only for an entry with a ttl, and a get
          or fetch no longer allocates on a miss. A cache miss: 51ns to 29ns.
        - FIXES a double free under ithreads: a new thread cloned every handle
          and freed it on exit, unmapping the arena under its creator. Handles
          are no longer cloned; a thread attaches by name.

0.02    2026-09-11
        - FIXES the Windows FAIL in 0.01. Three test files forked without
          skipping on MSWin32, where fork is emulated with threads: a child
          calling exit ends the whole file, so every assertion passed, no plan
          was printed, and the harness called it a FAIL.
        - FIXES a test that failed 9 runs in 12 on a two-processor container
          and 0 in 12 here. It had four children write 2000 churn keys into a
          512-entry cache to force eviction, then asserted an entry written
          before that churn had survived it. The children report through a
          pipe now; eviction is still asserted, where it belongs.
        - FIXES carving a region being refused under contention. The stripe
          lock is a pure spin, so with more carvers than cores the budget
          burned while the holder was not scheduled
        - FIXES a test using pack('Q<'), which is a fatal "Invalid type" on a
          perl built with ivsize=4.


0.01    2026-09-10
        - First version.
