Skip to content

Latest commit

 

History

History
64 lines (54 loc) · 4.29 KB

File metadata and controls

64 lines (54 loc) · 4.29 KB

Changelog — v1.1.2

Immutable release entry — part of the project changelog. One file per release; format and rationale in ADR-0038. Released entries are never edited.

1.1.2 — 2026-06-15

Maintenance release. A PATCH fixing four verified, third-party-reported defects (the first real use of the in-repo bug ledger, ADR-0039) plus the accumulated documentation work. The library's public surface is unchanged from v1.1.1 (no API/ABI change); the fixes are header-only / core internals. Highlights: an InstrumentedPool data race on the growth counter (BUG-0001), a live_ counter underflow on foreign/double frees + an over-promising header note (BUG-0002), a missing destroyed event on move-assignment (BUG-0003), and a latent grow_pool overflow guard (BUG-0004).

Removed

  • The docs-site CI status badge was removed from the README header in all three locales (English, zh-Hans, ja). The published Doxygen site is already linked from the API reference badge, so the separate build-status badge was redundant. The docs-site.yml workflow itself is unchanged. Documentation-only; no API change.

Changed

  • zh-Hans / ja README translations re-synced to v1.1.1. Carries the English README's v1.1.1 deltas into both locales — the v1.1.1 status badge (and its release-tag link) and the new v1.1.1 status paragraph (bug ledger, PR-metadata policy, SECURITY.md, packaging-smoke CI, session journal, the roadmap-placement rule, and the changelog split), with the translation-status.md manifest re-pinned. Documentation-only; no API change.

Fixed

  • InstrumentedPool data race on the growth counter (BUG-0001). notify_if_grew() read and wrote the non-atomic last_growths_ on the allocation hot path, while the decorator is documented as safe to drive concurrently over a thread-safe pool — a data race (UB) under MUTEX + dynamic growth. last_growths_ is now std::atomic and advanced with a compare_exchange, so the growth event is emitted once per growth without a race. A concurrent InstrumentedPool case was added to the ThreadSanitizer stress suite. Header-only; no API change.
  • InstrumentedPool::deallocate no longer underflows live_ (BUG-0002). A foreign or double-freed pointer (a no-op in the core, ADR-0012) used to decrement the unsigned live_ counter unconditionally, wrapping it to SIZE_MAX and corrupting stats(). The decrement now clamps at zero. The C header's memory_pool_free note was corrected to stop claiming the Decorator detects double-free (it counts but cannot distinguish one). Header/doc-only; no API change.
  • InstrumentedPool move-assignment now emits destroyed for the replaced pool (BUG-0003). Move-assigning over an instrumented pool released its Pool and observers without notifying PoolEvent::destroyed, asymmetric with the destructor. It now notifies before reassignment. Header-only; no API change.
  • Overflow guard in grow_pool (BUG-0004). The dynamic-growth path computed total * (grow_factor_ - 1) before any overflow check, so that product could wrap size_t and feed the downstream block_size guard an already-wrapped value. Added a would_overflow_product guard on the growth-count product first, mirroring the create-path guard; on overflow the pool falls back to fixed-mode exhaustion. Latent (not runtime-reachable — RAM exhausts first); no API change.