Skip to content

chore: release v2.2.3 - #43

Merged
Ttimmahlax merged 2 commits into
mainfrom
release-plz-2026-10-01T22-28-47Z
Oct 5, 2026
Merged

Ttimmahlax merged 2 commits into
mainfrom
release-plz-2026-10-01T22-28-47Z

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

🤖 New release

  • rusty_alloc: 2.2.2 -> 2.2.3 (✓ API compatible changes)
  • rusty_alloc-api: 2.2.2 -> 2.2.3
Changelog

rusty_alloc

2.2.3 - 2026-10-05

Fixed

  • (segment) a failed re-commit is a failed span, not unbacked memory

Fixed

  • A failed re-commit no longer hands out unbacked memory (Windows, purging
    on).
    With purge_delay >= 0 and purge_decommits on, a freed span is
    decommitted, and reuse re-commits it — but the result of that commit was
    discarded. Windows has no overcommit, so MEM_COMMIT fails once the
    system's commit is exhausted, and the span was carved anyway: the first
    store into it was an access violation in page_extend. One was seen in a
    shipping consumer (secure on, purge_delay = 0, the machine at 98.5 % of
    its commit limit). A failed re-commit is now a failed span: it stays on the
    free list still marked purged, the allocator moves on, and true exhaustion
    ends as an ordinary allocation failure. The default configuration
    (purge_delay = -1) never purges and was not exposed. Details:
    docs/plans/recommit-failure-ignored.md.
  • The same for whole segments. segment_free and huge_free restore a
    purged or guarded segment's commit and access before recycling it, and
    dropped both results. A segment the OS will not restore is no longer
    recycled: it is released to the OS, or, inside an arena, retired in place.

Added

  • stats::commit_failures(): a process-wide count of commits refused on
    those paths, also printed by stats::print_process as failed commits N.
    Non-zero after a fault in the page layer says the machine ran out of
    commit.

rusty_alloc-api

2.2.1 - 2026-09-25

Performance

  • GlobalAlloc methods are #[inline], as the mimalloc crate's are, so
    rustc's __rust_alloc / __rust_dealloc shims carry the fast path instead
    of jumping to it, and dealloc is the free fast path with its null test
    folded away. Measured whole-program against 2.2.0 on two deterministic Rust
    workloads (bench/rust-globalalloc.sh): -21.1 % and -5.8 %.
  • Layouts aligned up to two words (16 bytes on 64-bit) come from the natural
    size classes
    , which are already aligned that far, instead of the aligned
    path; every hashbrown table is such a layout. tests/natural_align.rs pins
    the alignment for every size class through alloc, alloc_zeroed and realloc.
  • realloc keeps a block in place at any alignment when it fits instead
    of always allocating, copying and freeing above 8 bytes of alignment:
    -27.3 % on an over-aligned buffer workload.


This PR was generated with release-plz.

@github-actions
github-actions Bot force-pushed the release-plz-2026-10-01T22-28-47Z branch from 3644360 to 4912196 Compare October 5, 2026 01:09
@github-actions github-actions Bot changed the title chore: release v2.2.2 chore: release v2.2.3 Oct 5, 2026
…nerated duplicate

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Ttimmahlax
Ttimmahlax merged commit a93ea28 into main Oct 5, 2026
12 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants