From cac341e5511f2674e6e86f00790d75d0be3ebfcf Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 25 Sep 2026 09:21:57 -0700 Subject: [PATCH 1/3] chore: stop tracking bench/wasm-speed build output bench/wasm-speed/target/ was committed by mistake: fingerprints, lock files and a built .wasm. It is build output, regenerated on every run. Co-Authored-By: Claude Opus 5.5 (1M context) --- bench/wasm-speed/target/.rustc_info.json | 1 - bench/wasm-speed/target/CACHEDIR.TAG | 3 -- .../target/release/.cargo-artifact-lock | 0 .../target/release/.cargo-build-lock | 0 bench/wasm-speed/target/release/.cargo-lock | 0 .../wasm32-unknown-unknown/CACHEDIR.TAG | 3 -- .../release/.cargo-artifact-lock | 0 .../release/.cargo-build-lock | 0 .../release/.cargo-lock | 0 .../dep-lib-rusty_alloc | Bin 357 -> 0 bytes .../invoked.timestamp | 1 - .../lib-rusty_alloc | 1 - .../lib-rusty_alloc.json | 1 - .../output-lib-rusty_alloc | 2 -- .../dep-lib-rusty_alloc_api | Bin 30 -> 0 bytes .../invoked.timestamp | 1 - .../lib-rusty_alloc_api | 1 - .../lib-rusty_alloc_api.json | 1 - .../dep-lib-speedprobe | Bin 30 -> 0 bytes .../invoked.timestamp | 1 - .../lib-speedprobe | 1 - .../lib-speedprobe.json | 1 - .../deps/librusty_alloc-30203c3fd9d3b00b.rlib | Bin 598836 -> 0 bytes .../librusty_alloc-30203c3fd9d3b00b.rmeta | Bin 440063 -> 0 bytes .../librusty_alloc_api-65fdac25e68ac577.rlib | Bin 18824 -> 0 bytes .../librusty_alloc_api-65fdac25e68ac577.rmeta | Bin 9372 -> 0 bytes .../deps/rusty_alloc-30203c3fd9d3b00b.d | 26 ------------------ .../deps/rusty_alloc_api-65fdac25e68ac577.d | 7 ----- .../release/deps/speedprobe.d | 5 ---- .../release/deps/speedprobe.wasm | Bin 43666 -> 0 bytes .../release/speedprobe.d | 1 - .../release/speedprobe.wasm | Bin 43666 -> 0 bytes 32 files changed, 57 deletions(-) delete mode 100644 bench/wasm-speed/target/.rustc_info.json delete mode 100644 bench/wasm-speed/target/CACHEDIR.TAG delete mode 100644 bench/wasm-speed/target/release/.cargo-artifact-lock delete mode 100644 bench/wasm-speed/target/release/.cargo-build-lock delete mode 100644 bench/wasm-speed/target/release/.cargo-lock delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/CACHEDIR.TAG delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-artifact-lock delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-build-lock delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-lock delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/dep-lib-rusty_alloc delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/invoked.timestamp delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc.json delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/output-lib-rusty_alloc delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/dep-lib-rusty_alloc_api delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/invoked.timestamp delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api.json delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/dep-lib-speedprobe delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/invoked.timestamp delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe.json delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc-30203c3fd9d3b00b.rlib delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc-30203c3fd9d3b00b.rmeta delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc_api-65fdac25e68ac577.rlib delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc_api-65fdac25e68ac577.rmeta delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc-30203c3fd9d3b00b.d delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc_api-65fdac25e68ac577.d delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.d delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.wasm delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/speedprobe.d delete mode 100644 bench/wasm-speed/target/wasm32-unknown-unknown/release/speedprobe.wasm diff --git a/bench/wasm-speed/target/.rustc_info.json b/bench/wasm-speed/target/.rustc_info.json deleted file mode 100644 index 6f6f186..0000000 --- a/bench/wasm-speed/target/.rustc_info.json +++ /dev/null @@ -1 +0,0 @@ -{"rustc_fingerprint":10247008043229276228,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\talmo\\.rustup\\toolchains\\1.97.1-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"128\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""},"11652014622397750202":{"success":true,"status":"","code":0,"stdout":"___.wasm\nlib___.rlib\n___.wasm\nlib___.a\nC:\\Users\\talmo\\.rustup\\toolchains\\1.97.1-x86_64-pc-windows-msvc\noff\n___\ndebug_assertions\npanic=\"abort\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"wasm32\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"wasm\"\ntarget_feature=\"bulk-memory\"\ntarget_feature=\"multivalue\"\ntarget_feature=\"mutable-globals\"\ntarget_feature=\"nontrapping-fptoint\"\ntarget_feature=\"reference-types\"\ntarget_feature=\"sign-ext\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"unknown\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\n","stderr":"warning: dropping unsupported crate type `dylib` for target `wasm32-unknown-unknown`\n\nwarning: dropping unsupported crate type `proc-macro` for target `wasm32-unknown-unknown`\n\nwarning: 2 warnings emitted\n\n"},"8480363167076041836":{"success":true,"status":"","code":0,"stdout":"rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: x86_64-pc-windows-msvc\nrelease: 1.97.1\nLLVM version: 22.1.6\n","stderr":""}},"successes":{}} \ No newline at end of file diff --git a/bench/wasm-speed/target/CACHEDIR.TAG b/bench/wasm-speed/target/CACHEDIR.TAG deleted file mode 100644 index 20d7c31..0000000 --- a/bench/wasm-speed/target/CACHEDIR.TAG +++ /dev/null @@ -1,3 +0,0 @@ -Signature: 8a477f597d28d172789f06886806bc55 -# This file is a cache directory tag created by cargo. -# For information about cache directory tags see https://bford.info/cachedir/ diff --git a/bench/wasm-speed/target/release/.cargo-artifact-lock b/bench/wasm-speed/target/release/.cargo-artifact-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/release/.cargo-build-lock b/bench/wasm-speed/target/release/.cargo-build-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/release/.cargo-lock b/bench/wasm-speed/target/release/.cargo-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/CACHEDIR.TAG b/bench/wasm-speed/target/wasm32-unknown-unknown/CACHEDIR.TAG deleted file mode 100644 index 20d7c31..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/CACHEDIR.TAG +++ /dev/null @@ -1,3 +0,0 @@ -Signature: 8a477f597d28d172789f06886806bc55 -# This file is a cache directory tag created by cargo. -# For information about cache directory tags see https://bford.info/cachedir/ diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-artifact-lock b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-artifact-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-build-lock b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-build-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-lock b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.cargo-lock deleted file mode 100644 index e69de29..0000000 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/dep-lib-rusty_alloc b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/dep-lib-rusty_alloc deleted file mode 100644 index c35a78fb12eebc9566a6535feb1ffa7bad9dd530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmY+9Ne;sx3`NPZ^Kg)!C{pAkZfXfI0;IO5Zxdq{EI{&;-?!ZvV}9Lz{mo&0DNa3k z%8!_g*(u;8H-h&x3;?{M_<}amd8Jq#kQuhFr*AiKS7ji`FvN z@hq@v`5UlkCvA)1XD++lYPO{bhrn#bt%tr)cdcO%(Sx*9Q)WKtgY8tXmZv5wz=91J JNe^6i_ygglV1xhw diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/invoked.timestamp b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/invoked.timestamp deleted file mode 100644 index e00328d..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/invoked.timestamp +++ /dev/null @@ -1 +0,0 @@ -This file has an mtime of when this was started. \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc deleted file mode 100644 index 628d8de..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc +++ /dev/null @@ -1 +0,0 @@ -9fde96e39c204a3d \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc.json b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc.json deleted file mode 100644 index cf67230..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/lib-rusty_alloc.json +++ /dev/null @@ -1 +0,0 @@ -{"rustc":3720210673988096810,"features":"[\"default\", \"std\"]","declared_features":"[\"blockmap\", \"debug_checks\", \"default\", \"linkcheck\", \"profile\", \"secure\", \"std\"]","target":10085266625313816817,"profile":12927086336690686898,"path":2916297298608968487,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"wasm32-unknown-unknown\\release\\.fingerprint\\rusty_alloc-30203c3fd9d3b00b\\dep-lib-rusty_alloc","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":14682669768258224367} \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/output-lib-rusty_alloc b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/output-lib-rusty_alloc deleted file mode 100644 index ef30ac7..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-30203c3fd9d3b00b/output-lib-rusty_alloc +++ /dev/null @@ -1,2 +0,0 @@ -{"$message_type":"diagnostic","message":"function `parse_value` is never used","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"F:\\coding\\rusty_alloc\\crates\\rusty_alloc\\src\\options.rs","byte_start":13654,"byte_end":13665,"line_start":333,"line_end":333,"column_start":4,"column_end":15,"is_primary":true,"text":[{"text":"fn parse_value(s: &str) -> Option {","highlight_start":4,"highlight_end":15}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[1m\u001b[93mwarning\u001b[0m\u001b[1m\u001b[97m: function `parse_value` is never used\u001b[0m\n \u001b[1m\u001b[96m--> \u001b[0mF:\\coding\\rusty_alloc\\crates\\rusty_alloc\\src\\options.rs:333:4\n \u001b[1m\u001b[96m|\u001b[0m\n\u001b[1m\u001b[96m333\u001b[0m \u001b[1m\u001b[96m|\u001b[0m fn parse_value(s: &str) -> Option {\n \u001b[1m\u001b[96m|\u001b[0m \u001b[1m\u001b[93m^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[96m|\u001b[0m\n \u001b[1m\u001b[96m= \u001b[0m\u001b[1m\u001b[97mnote\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\n"} -{"$message_type":"diagnostic","message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[1m\u001b[93mwarning\u001b[0m\u001b[1m\u001b[97m: 1 warning emitted\u001b[0m\n\n"} diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/dep-lib-rusty_alloc_api b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/dep-lib-rusty_alloc_api deleted file mode 100644 index 02bca30b2ac874769893912718791f0b09ae9c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30 gcmZQ%U|{&q$Ot4ExPZ90C^;r4GfA(g7$m{~07TIQ`v3p{ diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/invoked.timestamp b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/invoked.timestamp deleted file mode 100644 index e00328d..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/invoked.timestamp +++ /dev/null @@ -1 +0,0 @@ -This file has an mtime of when this was started. \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api deleted file mode 100644 index eccdbee..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api +++ /dev/null @@ -1 +0,0 @@ -1e99924ea3cbaf62 \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api.json b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api.json deleted file mode 100644 index b5c8202..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/rusty_alloc-api-65fdac25e68ac577/lib-rusty_alloc_api.json +++ /dev/null @@ -1 +0,0 @@ -{"rustc":3720210673988096810,"features":"[\"default\", \"std\"]","declared_features":"[\"debug_checks\", \"default\", \"profile\", \"secure\", \"std\"]","target":10444181462946702350,"profile":12927086336690686898,"path":17481420428904646363,"deps":[[2387993517738183206,"rusty_alloc",false,4416378242795495071]],"local":[{"CheckDepInfo":{"dep_info":"wasm32-unknown-unknown\\release\\.fingerprint\\rusty_alloc-api-65fdac25e68ac577\\dep-lib-rusty_alloc_api","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":14682669768258224367} \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/dep-lib-speedprobe b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/dep-lib-speedprobe deleted file mode 100644 index 02bca30b2ac874769893912718791f0b09ae9c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30 gcmZQ%U|{&q$Ot4ExPZ90C^;r4GfA(g7$m{~07TIQ`v3p{ diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/invoked.timestamp b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/invoked.timestamp deleted file mode 100644 index e00328d..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/invoked.timestamp +++ /dev/null @@ -1 +0,0 @@ -This file has an mtime of when this was started. \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe deleted file mode 100644 index dfcf9b3..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe +++ /dev/null @@ -1 +0,0 @@ -3fa7fc3be998846a \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe.json b/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe.json deleted file mode 100644 index 3570d03..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/.fingerprint/speedprobe-f92ee3d991fb435d/lib-speedprobe.json +++ /dev/null @@ -1 +0,0 @@ -{"rustc":3720210673988096810,"features":"[\"ra\"]","declared_features":"[\"ra\"]","target":16610879620610110527,"profile":5652530863572545030,"path":10763286916239946207,"deps":[[2387993517738183206,"rusty_alloc",false,4416378242795495071],[17777520122732431131,"rusty_alloc_api",false,7111126238899640606]],"local":[{"CheckDepInfo":{"dep_info":"wasm32-unknown-unknown\\release\\.fingerprint\\speedprobe-f92ee3d991fb435d\\dep-lib-speedprobe","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":14682669768258224367} \ No newline at end of file diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc-30203c3fd9d3b00b.rlib b/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/librusty_alloc-30203c3fd9d3b00b.rlib deleted file mode 100644 index 606430236ecfe725932b4e45525a0c91261c15f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598836 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

-4wa??hZ{1Wi*_V+*qPXzsMeOODVy=1unFK|< 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 z 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

2WH;OV*Y0MM|B~J8mS5h@a{u6N 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�TX-4Q9+2XQM+Rw(!Y@pBI|c3Yrk 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ί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%0AKT5af5@gdVaHKOCuE!Vh-K%@vT44wS;LGse(2k2 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%0D>`lrwCJw3Ep%gF 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,+M~;&^9&{W+Hj;+ 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 V(Q7lWv!d>LE9$SeA`TDQ*Bq>lH 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 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc-30203c3fd9d3b00b.d b/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc-30203c3fd9d3b00b.d deleted file mode 100644 index 0633985..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc-30203c3fd9d3b00b.d +++ /dev/null @@ -1,26 +0,0 @@ -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\rusty_alloc-30203c3fd9d3b00b.d: F:\coding\rusty_alloc\crates\rusty_alloc\src\lib.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\alloc.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\arena.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\bins.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\heap.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\init.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\options.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\os.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\page.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\mod.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\wasm.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\fixed.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\random.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment_map.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\slice_pool.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\stats.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\types.rs - -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\librusty_alloc-30203c3fd9d3b00b.rlib: F:\coding\rusty_alloc\crates\rusty_alloc\src\lib.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\alloc.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\arena.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\bins.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\heap.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\init.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\options.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\os.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\page.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\mod.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\wasm.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\fixed.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\random.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment_map.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\slice_pool.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\stats.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\types.rs - -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\librusty_alloc-30203c3fd9d3b00b.rmeta: F:\coding\rusty_alloc\crates\rusty_alloc\src\lib.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\alloc.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\arena.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\bins.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\heap.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\init.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\options.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\os.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\page.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\mod.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\wasm.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\fixed.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\random.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\segment_map.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\slice_pool.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\stats.rs F:\coding\rusty_alloc\crates\rusty_alloc\src\types.rs - -F:\coding\rusty_alloc\crates\rusty_alloc\src\lib.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\alloc.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\arena.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\bins.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\heap.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\init.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\options.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\os.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\page.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\mod.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\wasm.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\prim\fixed.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\random.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\segment.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\segment_map.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\slice_pool.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\stats.rs: -F:\coding\rusty_alloc\crates\rusty_alloc\src\types.rs: - -# env-dep:CARGO_PKG_VERSION=2.0.0 diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc_api-65fdac25e68ac577.d b/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc_api-65fdac25e68ac577.d deleted file mode 100644 index dca9d55..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/rusty_alloc_api-65fdac25e68ac577.d +++ /dev/null @@ -1,7 +0,0 @@ -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\rusty_alloc_api-65fdac25e68ac577.d: F:\coding\rusty_alloc\crates\rusty_alloc_api\src\lib.rs - -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\librusty_alloc_api-65fdac25e68ac577.rlib: F:\coding\rusty_alloc\crates\rusty_alloc_api\src\lib.rs - -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\librusty_alloc_api-65fdac25e68ac577.rmeta: F:\coding\rusty_alloc\crates\rusty_alloc_api\src\lib.rs - -F:\coding\rusty_alloc\crates\rusty_alloc_api\src\lib.rs: diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.d b/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.d deleted file mode 100644 index eaf0fbf..0000000 --- a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.d +++ /dev/null @@ -1,5 +0,0 @@ -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\speedprobe.d: src\lib.rs - -F:\coding\rusty_alloc\bench\wasm-speed\target\wasm32-unknown-unknown\release\deps\speedprobe.wasm: src\lib.rs - -src\lib.rs: diff --git a/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.wasm b/bench/wasm-speed/target/wasm32-unknown-unknown/release/deps/speedprobe.wasm deleted file mode 100644 index 5630084d9670c03f5d22a8399937daac791887a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43666 zcmeIb3y>VwdEeWQdF{^3?f`-!$e^X35gdb|K<;yP0nri~e25H1J!s0JT}llX*deeF z>;k(3fbgY>r3BF|hmL58vZ3->|0lH*)b|na^;(f z!#FNq=9&rb@Bf|CGrfx!iAYf@HdxE#oeN2Scyxbk^oN-DAglXF5l_bH_V} zRv(PR`jPHRcWvQtr?<9nd_AaEkIx#iRSYC~@bgEXve+p+EY-fsb2a=#3q`_!436f}k5O4_>)3b}MFp1LN4c4t_FXbWsTdck( z49~u0gMUHVSZam4?KTP1$|4PeJyFp3kX}Xyl5kH{X$9%o+w0cno~YLNuwDgKsy7y0 z%j(l%809*QeTQ*cSX2)|tDs8(Si;3tloZmiM-ex7?P^7-%I&Uk&W*~rG1YHlOs=(N zs7s|8)xxT~qq`((M@%Ovw4*|Lwi#*WA@^MDO+0|^I!z={Z&YdgxC6iOH{A8#K@Ml5 z1Ma^hPG8|)c$Y>_<6bLHU*@^YGhKx0B1+=MN7S?#*5YakvR?Ysd7cV1c%<;2IuIrC z;-2W~N-NULX#}i>1pyo-lMGwO(A6_T1>iXJn9D1%Utaw zbg-z;LJAU?T-FK@tyuU_F?|Nr4;RCd&69$WQ%r00gaCZ*kuPrqOtaC0h96o?nfI<% zoW!6iUdk$JIu}^EcyBP>Dx}pDLeHLPcQdvXp>Cn^ynz{4g{LGI0=cB&sXMu2DrwLx z4vGl#6Ap0&A+9WJ7m_mfZZ?#9#A#HTIMk>j&rxbq0g(;@4S(k@ zp+88Vf>!+YR=lenRg#!_)r#<$ zRZXK!b*u)J-&q$Yib>-5fO<7gifbqO(=J4g3U2(GxD@KOo$k#K<=(-By?2DqX5c(ST&YvZJR6D)mCARoN4L zv7(N^mSYz|pv8ld`lAAVl9Y2Z($ZAY#PiSAw-S|92pW$G1xz<7Yx-qPzryqjFs*OO zR2_IM6vNh7rJ_hTO3#aSBIpdTge?9_;J45m;x2GA8O&oC5X&dhsJACVld|@eyf}~u zXqh%B8~i^&jk zOe)rS`p}{j3-$fdYi>i5ze5z97bPHZq#BFqOV9{Q2a1}d^c~HD=4Lw7Nw9K;#vpxA z6(s{C2wWEqYsj*!N2Xb_o{eE#TZDi|A&BcEE!}ANRbW9H8O7Rs4OfM1U_Zf(if^wM zYuFe0WrX}pg8C&a<(4pg>G|LKiI7z*NPai9jsO8J>b+!Wor!Eal@xR>_H-Qr9mjbB zQx&mcAKKP116CK)m&;zpU(2E*42&(WvZ$s0qLz~4RTi}

Y)vwOM2Zjc|YT7tg;K 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

Y)vwOM2Zjc|YT7tg;K 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 Date: Fri, 25 Sep 2026 09:21:57 -0700 Subject: [PATCH 2/3] ci(corpus): prove every candidate builds THIS tree; add the SpaceDB mirror and Silesia Two rows had been passing while testing the crates.io allocator: rusty_zstd reaches us through the published rusty_alloc_default shim (its 2026-09-08 PASS never built this tree), and a TMPDIR under this repo made repoint skip every manifest. The runner now patches the shim to a repointed local copy, refuses a work dir inside the repo, leaves { workspace = true } entries alone, and reads each candidate's Cargo.lock: a registry rusty_alloc is NOT-REPOINTED, never PASS. Adds spacedb (published mirror) to corpus.toml and tools/corpus/silesia.sh (Silesia through rzstd: byte-identical to the published-allocator build, round-trip through C zstd both ways). Co-Authored-By: Claude Opus 5.5 (1M context) --- tools/corpus/README.md | 39 ++++++++++++++++++++++++- tools/corpus/corpus.toml | 10 +++++++ tools/corpus/run.sh | 63 ++++++++++++++++++++++++++++++++++++++++ tools/corpus/silesia.sh | 33 +++++++++++++++++++++ 4 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 tools/corpus/silesia.sh diff --git a/tools/corpus/README.md b/tools/corpus/README.md index ea8cd57..f4889bd 100644 --- a/tools/corpus/README.md +++ b/tools/corpus/README.md @@ -52,7 +52,26 @@ rusty_alloc-api = { version = "2", default-features = false, features = ["std"] With that applied to the copy, the `rusty_alloc` error is gone. -## Four things this harness got wrong before it got anything right +## Run of 2026-09-25 (`--test`, after CURIOSITY rounds three and four) + +The first run to verify, per row, that the candidate resolved THIS tree. + +| consumer | result | +|---|---| +| `spacedb-sdk` | PASS | +| `spacedb-sdk` (`secure`) | PASS | +| `rusty_alloc_default` | PASS | +| `rusty_zstd` (through the patched shim) | PASS | +| `spacedb (published mirror)` (`F:/coding/spacedb`, new) | PASS | +| `rusty_maplibre` | FAIL, the known 2.0.0 `no_std` break. With the documented `features = ["std"]` migration applied to the copy: **1,199 tests passed, 0 failed** | + +Beyond the harness, the same day (see `docs/LEDGER.md`, DOWNSTREAM CORPUS; +the Silesia check is `tools/corpus/silesia.sh`): +both SpaceDB and `rusty_zstd` workspaces ran their whole test suites on Linux +with this tree's allocator `LD_PRELOAD`ed into every test binary, and Silesia +went through `rusty_zstd`'s CLI against C zstd 1.5.7 on Windows and Linux. + +## Seven things this harness got wrong before it got anything right Recorded because each one made it lie, and a corpus that lies is worse than none — it gets muted. @@ -77,6 +96,24 @@ Recorded because each one made it lie, and a corpus that lies is worse than none true FAIL. **If a run shows fork or cygheap errors, re-run the affected consumer in isolation before believing its row.** +5. **A PASS can test the wrong allocator.** Two ways, both found on + 2026-09-25, and the first run's `rusty_zstd` PASS was one of them. + `rusty_zstd` names no `rusty_alloc*` crate; it reaches us through the + published `rusty_alloc_default` shim, which pins the crates.io allocator, + so its candidate never built this tree. And with `TMPDIR` inside this + repository, `repoint` skipped every manifest (its `/target/` exclusion + matched the copy's own path), so SpaceDB's candidates built crates.io + 1.1.6 and PASSED. The shim is now patched to a repointed local copy, the + script refuses a work dir inside the repo, and **every candidate's + `Cargo.lock` is checked: a registry `rusty_alloc` in it is reported + NOT-REPOINTED, never PASS.** +6. **A work dir inside this repository breaks copies that have no workspace + root:** cargo walks up into this repo's `[workspace]` and refuses to build + (`rusty_alloc_default` read FAIL for that reason alone). +7. **`{ workspace = true }` entries must be left alone.** `repoint` added a + `path` to `rmap-alloc`'s inherited dependencies; the root is rewritten on + its own. + ## What it still does not do Compile gates only, unless `--test` is passed. It does not measure downstream diff --git a/tools/corpus/corpus.toml b/tools/corpus/corpus.toml index 599ac4e..785ed11 100644 --- a/tools/corpus/corpus.toml +++ b/tools/corpus/corpus.toml @@ -49,3 +49,13 @@ name = "rusty_maplibre" path = "F:/coding/rusty_maplibre" features = "" note = "KNOWN RISK: takes rusty_alloc AND rusty_alloc-api with default-features = false, which is exactly what 2.0.0 redefines" + +[[consumer]] +name = "spacedb (published mirror)" +path = "F:/coding/spacedb" +pkg = "spacedb-sdk" +features = "" +# The standalone checkout `release/release.sh` generates from mata-master's +# packages — the tree crates.io receives. Registered separately because it is +# what ships, and it carries its own workspace root (no synth needed). +note = "generated mirror of packages/spacedb; rusty_alloc-api =1.1.6, default-on" diff --git a/tools/corpus/run.sh b/tools/corpus/run.sh index 9a5a4c0..109ac98 100644 --- a/tools/corpus/run.sh +++ b/tools/corpus/run.sh @@ -23,6 +23,18 @@ set -uo pipefail root="$(cd "$(dirname "$0")/../.." && pwd)" work="${TMPDIR:-/tmp}/ra-corpus" +# The copies must live OUTSIDE this repository, for two reasons that each made +# a run lie (2026-09-25, with TMPDIR under this repo's `target/`): `repoint` +# skips every path containing `/target/`, so no manifest was rewritten and the +# candidates quietly built the crates.io allocator and PASSED; and a copy with +# no workspace root of its own walked up into this repo's `[workspace]` and +# failed to build at all. +mkdir -p "$work" +case "$(cd "$(dirname "$work")" 2>/dev/null && pwd -P)/" in + "$(cd "$root" && pwd -P)"/*) + echo "refusing: work dir $work is inside $root -- set TMPDIR elsewhere" >&2 + exit 2 ;; +esac mode="check" [ "${1:-}" = "--test" ] && mode="test" @@ -47,6 +59,11 @@ orig = s # `name = { version = "...", ... }` -> keep the rest, swap in a path def patch(m): name, body = m.group(1), m.group(2) + # `{ workspace = true }` inherits from the root, which is rewritten on its + # own; adding a `path` here makes an entry cargo should reject (seen on + # rusty_maplibre's rmap-alloc, 2026-09-25). + if re.search(r'\bworkspace\s*=\s*true', body): + return m.group(0) tgt = api if 'api' in name else alloc body = re.sub(r'version\s*=\s*"[^"]*"\s*,?\s*', '', body) body = body.strip().strip(',').strip() @@ -62,6 +79,44 @@ PY done } +# Consumers that reach us THROUGH the `rusty_alloc_default` shim (rusty_zstd) +# name no `rusty_alloc*` crate themselves, so `repoint` leaves them on the +# published shim — and the published shim pins the crates.io allocator. Until +# 2026-09-25 their candidate therefore tested the release, not this tree. Patch +# the shim to a copy of the local checkout that IS repointed. A +# `[patch.crates-io]` is legal here: the local shim carries the same version. +SHIM_SRC="${RA_SHIM_SRC:-$root/../rusty_alloc_default}" +patch_shim() { + local tree="$1" + grep -rqsE --include=Cargo.toml --exclude-dir=target '^rusty_alloc_default\s*=' "$tree" || return 0 + # The shim is a consumer in its own right; it is repointed directly. + grep -qE '^name\s*=\s*"rusty_alloc_default"' "$tree/Cargo.toml" 2>/dev/null && return 0 + local shim="$work/_shim" + if [ ! -d "$shim" ]; then + [ -d "$SHIM_SRC" ] || { echo " (no $SHIM_SRC to patch the shim with)" >&2; return 0; } + mkdir -p "$shim" + (cd "$SHIM_SRC" && tar -cf - --exclude=./target --exclude=./.git .) | (cd "$shim" && tar -xf -) + repoint "$shim" + fi + local p; p="$(cygpath -m "$shim" 2>/dev/null || echo "$shim")" + if grep -q '^\[patch.crates-io\]' "$tree/Cargo.toml"; then + sed -i "/^\[patch.crates-io\]/a rusty_alloc_default = { path = \"$p\" }" "$tree/Cargo.toml" + else + printf '\n[patch.crates-io]\nrusty_alloc_default = { path = "%s" }\n' "$p" >> "$tree/Cargo.toml" + fi +} + +# Did the candidate actually build THIS tree? A registry `source` on any +# rusty_alloc crate in its lock means no — and such a row used to PASS. +resolved_from_registry() { + local lock="$1/Cargo.lock" + [ -f "$lock" ] || return 1 + awk '/^name = "rusty_alloc(-api)?"$/ { n = 1; next } + n && /^source = "registry/ { bad = 1 } + /^$/ { n = 0 } + END { exit !bad }' "$lock" +} + # Some consumers live in a workspace whose ROOT is not in this checkout -- # `packages/spacedb/*` inherit their sibling dependencies with # `workspace = true`, and mata-master carries no manifest above them. Without a @@ -141,10 +196,18 @@ run_one() { copy_tree "$dst" [ "${synth:-}" = "yes" ] && synth_workspace "$dst" repoint "$dst" + patch_shim "$dst" local cand_out cand_rc cand_out="$(cd "$dst" && cargo "$mode" --quiet "${fargs[@]}" 2>&1)" cand_rc=$? + if resolved_from_registry "$dst"; then + echo " NOT-REPOINTED the candidate resolved rusty_alloc from crates.io -- this row tests nothing" + ROWS+=("NOT-REPOINTED|$name|candidate still built the crates.io allocator") + fail=$((fail + 1)) + return + fi + if grep -q "failed to find a workspace root" <<<"$base_out"; then echo " SKIP workspace root absent from this checkout -- cannot answer here" ROWS+=("SKIP|$name|workspace root not in this checkout") diff --git a/tools/corpus/silesia.sh b/tools/corpus/silesia.sh new file mode 100644 index 0000000..59d5a49 --- /dev/null +++ b/tools/corpus/silesia.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# Silesia under rusty_zstd's CLI, published allocator (BASE) vs this tree (CAND), +# with C zstd 1.5.7 as the independent oracle. Per file and level: +# 1. CAND compresses byte-identically to BASE (an allocator must not change output) +# 2. CAND decodes its own frame to the original +# 3. C zstd decodes CAND's frame to the original +# 4. CAND decodes C zstd's frame to the original +# plus the same with 4 worker threads (-T4), which exercises cross-thread frees. +# usage: silesia.sh +set -u +B="$1"; C="$2"; O="$3"; S="$4"; W="$5"; mkdir -p "$W" +pass=0; fail=0 +bad() { echo "FAIL $*"; fail=$((fail + 1)); } +for f in "$S"/*; do + n=$(basename "$f") + for lv in 1 3 9 19; do + "$B" -q -$lv -c "$f" > "$W/b.zst" || { bad "$n -$lv base compress"; continue; } + "$C" -q -$lv -c "$f" > "$W/c.zst" || { bad "$n -$lv cand compress"; continue; } + cmp -s "$W/b.zst" "$W/c.zst" || bad "$n -$lv compressed bytes differ from base" + "$C" -q -d -c "$W/c.zst" > "$W/c.out" && cmp -s "$f" "$W/c.out" || bad "$n -$lv cand->cand roundtrip" + "$O" -q -d -c "$W/c.zst" > "$W/o.out" && cmp -s "$f" "$W/o.out" || bad "$n -$lv cand->C decode" + "$O" -q -$lv -c "$f" > "$W/o.zst" && "$C" -q -d -c "$W/o.zst" > "$W/co.out" && cmp -s "$f" "$W/co.out" || bad "$n -$lv C->cand decode" + pass=$((pass + 1)) + done + "$B" -q -3 -T4 -c "$f" > "$W/bt.zst" && "$C" -q -3 -T4 -c "$f" > "$W/ct.zst" || { bad "$n -T4 compress"; continue; } + cmp -s "$W/bt.zst" "$W/ct.zst" || bad "$n -T4 compressed bytes differ from base" + "$O" -q -d -c "$W/ct.zst" > "$W/ot.out" && cmp -s "$f" "$W/ot.out" || bad "$n -T4 cand->C decode" + "$C" -q -d -c "$W/ct.zst" > "$W/ct.out" && cmp -s "$f" "$W/ct.out" || bad "$n -T4 cand->cand roundtrip" + pass=$((pass + 1)) + echo "done $n" +done +rm -f "$W"/*.zst "$W"/*.out +echo "silesia: $pass file-level cases, $fail failures" From fdda396ad7f518d0a9f928de4df3ea5a272345e6 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 25 Sep 2026 09:22:24 -0700 Subject: [PATCH 3/3] feat: four rounds of deterministic instruction wins, a Rust GlobalAlloc fast path, and 16-byte natural alignment Every change was measured alone on exact callgrind counts (opscan plus perl, sqlite, lua, python, jq, gawk and sort) and gated on the full suites on Windows and Linux. docs/LEDGER.md has each number and each refutation (CURIOSITY rounds one to four, DOWNSTREAM CORPUS). Against 2.2.0 (c9631f4), opscan Ir/op: xthread 113.71 -> 77.26, huge 689.68 -> 293.68, big 121.00 -> 92.00, mixed 110.93 -> 92.82, calloc 107.57 -> 93.19, posix_memalign 97.88 -> 83.69, realloc 259.86 -> 231.20. Allocator-only vs mimalloc: lua 0.52, perl 0.81, sqlite 0.83. Rust workloads (bench/rust-globalalloc.sh): -21.1 % boxed trees, -5.8 % maps, -27.3 % over-aligned realloc. Allocator core: - remote free to a parked page releases FREEING to NORMAL, as upstream does (MI_NO_DELAYED_FREE); single-block pages keep DELAYED - page_extend links at least four blocks (upstream MI_MIN_EXTEND) - span_mark skips interior slices that already point to their start - the medium arm pops before it collects; OOM retry only on fallible exits; realloc decides a move in one compare; frameless free_general; huge_alloc out of line; u8 zero flag in the generic chain - options: no allocation at start-up (prim::getenv), and one walk of environ on Linux instead of 76 getenv calls - huge blocks report the request rounded to a slice as usable size - malloc_aligned_pow2 (new, #[inline]) for callers that proved the alignment: posix_memalign, GlobalAlloc, C++ aligned new - ra_small_wsize knob (default unchanged) for 32-bit targets rusty_alloc-api: - GlobalAlloc methods are #[inline]; dealloc is the inline free - alignment up to two words served from the natural size classes - realloc keeps a block in place at any alignment when it fits Tests: options_env, natural_align, reentrancy. Unsafe census 947 -> 963, every site in UNSAFE.md. Downstream: SpaceDB and rusty_zstd full suites, Silesia byte-identical against the 2.2.0 build. Co-Authored-By: Claude Opus 5.5 (1M context) --- .gitignore | 3 + Cargo.toml | 2 +- README.md | 76 ++- bench/alignednew.cpp | 26 + bench/fastpath-ir/Cargo.lock | 118 ++++ bench/fastpath-ir/Cargo.toml | 15 + bench/fastpath-ir/src/main.rs | 128 ++++ bench/rust-globalalloc.sh | 21 + bench/rust-globalalloc/Cargo.lock | 118 ++++ bench/rust-globalalloc/Cargo.toml | 18 + bench/rust-globalalloc/src/bin/maps.rs | 29 + bench/rust-globalalloc/src/bin/overaligned.rs | 30 + bench/rust-globalalloc/src/bin/threads.rs | 18 + bench/rust-globalalloc/src/bin/trees.rs | 29 + crates/rusty_alloc/CHANGELOG.md | 97 +++ crates/rusty_alloc/Cargo.toml | 1 + crates/rusty_alloc/UNSAFE.md | 16 +- crates/rusty_alloc/src/alloc.rs | 192 +++++- crates/rusty_alloc/src/bins.rs | 11 +- crates/rusty_alloc/src/heap.rs | 226 ++++++- crates/rusty_alloc/src/options.rs | 355 ++++++++++- crates/rusty_alloc/src/page.rs | 53 +- crates/rusty_alloc/src/prim/fixed.rs | 4 + crates/rusty_alloc/src/prim/mod.rs | 37 ++ crates/rusty_alloc/src/prim/unix.rs | 48 ++ crates/rusty_alloc/src/prim/windows.rs | 23 + crates/rusty_alloc/src/segment.rs | 80 ++- crates/rusty_alloc/src/types.rs | 37 +- crates/rusty_alloc/tests/alloc_core.rs | 43 ++ crates/rusty_alloc/tests/loom_xthread.rs | 44 +- crates/rusty_alloc/tests/options_env.rs | 97 +++ crates/rusty_alloc_api/src/lib.rs | 100 +++- crates/rusty_alloc_api/tests/natural_align.rs | 142 +++++ crates/rusty_alloc_api/tests/reentrancy.rs | 129 ++++ crates/rusty_alloc_ffi/src/lib.rs | 20 +- docs/LEDGER.md | 561 ++++++++++++++++++ docs/opps.md | 43 ++ docs/plans/{ => finished}/fast-trans.md | 0 docs/plans/finished/youslowbro.md | 372 ++++++++++++ tools/unsafe-baseline.txt | 14 +- 40 files changed, 3246 insertions(+), 130 deletions(-) create mode 100644 bench/alignednew.cpp create mode 100644 bench/fastpath-ir/Cargo.lock create mode 100644 bench/fastpath-ir/Cargo.toml create mode 100644 bench/fastpath-ir/src/main.rs create mode 100644 bench/rust-globalalloc.sh create mode 100644 bench/rust-globalalloc/Cargo.lock create mode 100644 bench/rust-globalalloc/Cargo.toml create mode 100644 bench/rust-globalalloc/src/bin/maps.rs create mode 100644 bench/rust-globalalloc/src/bin/overaligned.rs create mode 100644 bench/rust-globalalloc/src/bin/threads.rs create mode 100644 bench/rust-globalalloc/src/bin/trees.rs create mode 100644 crates/rusty_alloc/tests/options_env.rs create mode 100644 crates/rusty_alloc_api/tests/natural_align.rs create mode 100644 crates/rusty_alloc_api/tests/reentrancy.rs rename docs/plans/{ => finished}/fast-trans.md (100%) create mode 100644 docs/plans/finished/youslowbro.md diff --git a/.gitignore b/.gitignore index 40daf08..4d27d65 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ .DS_Store /benchmark-*.txt /.claude/ + +# Standalone bench crates (their own workspaces) build next to themselves. +bench/*/target/ diff --git a/Cargo.toml b/Cargo.toml index 3467311..7396d6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -155,7 +155,7 @@ unsafe_op_in_unsafe_fn = "deny" # unify across the dependency graph, so two consumers wanting different # geometries would silently get one of them. A cfg is set by the DELIVERABLE, # the same way a Janus firmware picks its chip. -unexpected_cfgs = { level = "warn", check-cfg = ["cfg(loom)", "cfg(kani)", "cfg(ra_small_profile)", "cfg(ra_single_threaded)", "cfg(ra_max_extents, values(\"8\", \"16\", \"64\"))", "cfg(ra_aligned_region)", "cfg(ra_segment_size, values(\"256k\"))", "cfg(ra_generic_collect, values(\"64\", \"4096\", \"65536\"))"] } +unexpected_cfgs = { level = "warn", check-cfg = ["cfg(loom)", "cfg(kani)", "cfg(ra_small_profile)", "cfg(ra_single_threaded)", "cfg(ra_max_extents, values(\"8\", \"16\", \"64\"))", "cfg(ra_aligned_region)", "cfg(ra_segment_size, values(\"256k\"))", "cfg(ra_generic_collect, values(\"64\", \"4096\", \"65536\"))", "cfg(ra_small_wsize, values(\"256\", \"512\"))"] } # Lint policy (hardening gate H-15). `pedantic` and `nursery` are ENABLED at # workspace level and the build is clean under them, because every group diff --git a/README.md b/README.md index cc4ac82..99be7e4 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,11 @@ does not offer. ## The headline - Counting only the allocator's own instructions, where the comparison actually lives: - **0.66× / 0.83× / 0.85×**. + **0.52× / 0.81× / 0.83× mimalloc** on lua / perl / sqlite. +- **Rust programs got their own fast path**: `#[global_allocator]` users see + **up to −27 % whole-program instructions** against 2.2.0, with outputs + checked byte-for-byte on real consumers — see + [Rust programs](#rust-programs-globalalloc). - **A double free aborts instead of corrupting.** Upstream mimalloc accepts it silently in release builds; we detect it on both the local and the cross-thread path and abort. @@ -80,7 +84,7 @@ WHOLE-PROGRAM instructions: | workload | vs mimalloc | vs jemalloc | vs glibc | |---|---:|---:|---:| -| lua | **0.97** | **0.84** | 0.82 | +| lua | **0.96** | **0.84** | 0.81 | | perl | **0.99** | **0.89** | 0.81 | | sqlite | **1.00** | **0.98** | 0.99 | @@ -90,9 +94,61 @@ runs, decomposed: | workload | allocator share | **allocator-only ra/mi** | whole program | floor if our allocator cost ZERO | |---|---:|---:|---:|---:| -| lua | 4.9% | **0.66** | 0.97 | 0.93 | -| perl | 3.3% | **0.83** | 0.99 | 0.96 | -| sqlite | 1.5% | **0.85** | 1.00 | 0.98 | +| lua | 3.9% | **0.52** | 0.96 | 0.93 | +| perl | 3.2% | **0.81** | 0.99 | 0.96 | +| sqlite | 1.5% | **0.83** | 1.00 | 0.98 | + +Allocator-only Ir is summed by OBJECT from the raw callgrind file +(`bench/icount-arms.sh`), so code inlined from any source file counts. Measured +2026-09-25 against the mimalloc v2.4.5 oracle build. + +**What moved since 2.2.0** — four rounds of exact-instruction work, every +change gated on the counts and on the full suites (`docs/LEDGER.md`, +CURIOSITY rounds one to four). Per-op, `bench/opscan.c` (lower is better): + +| op | 2.2.0 (`c9631f4`) | now | Δ | +|---|---:|---:|---:| +| cross-thread free (`xthread`) | 113.71 | **77.26** | −32 % | +| huge (2 MiB) alloc + free | 689.68 | **293.68** | −57 % | +| `big` (4 KiB) alloc + free | 121.00 | **92.00** | −24 % | +| `mixed` sizes | 110.93 | **92.82** | −16 % | +| `calloc` | 107.57 | **93.19** | −13 % | +| `posix_memalign` | 97.88 | **83.69** | −14 % | +| `realloc` (grow) | 259.86 | **231.20** | −11 % | +| `small` (32 B) alloc + free | 54.39 | **52.25** | −4 % | + +Process start-up also got cheaper: reading the allocator's options used to +walk the environment 76 times; on Linux it now walks it once, about 25,000 +instructions saved on every process launch. + +### Rust programs (`GlobalAlloc`) + +Rust deliverables reach the allocator through `GlobalAlloc`, which the C +instruments above never exercise. Three deterministic Rust workloads +(`bench/rust-globalalloc.sh`, whole-program Ir per 20,000 steps, identical +checksums between arms): + +| workload | 2.2.0 (`c9631f4`) | now | Δ | +|---|---:|---:|---:| +| boxed trees, buffers, `Rc` | 23,357,670 | 18,436,430 | **−21.1 %** | +| hash maps, B-trees, strings | 28,220,088 | 26,577,921 | **−5.8 %** | +| cache-line-aligned buffers (`realloc`) | 1,856,092 | 1,349,905 | **−27.3 %** | +| short-lived threads | 12,201,584 | 12,105,054 | −0.8 % | + +What changed: the `GlobalAlloc` methods are `#[inline]` (as the `mimalloc` +crate's are), so rustc's `__rust_alloc` shims carry the fast path instead of +jumping to it; `dealloc` is the free fast path with its null test folded +away; layouts aligned to 16 bytes — every hashbrown table — are served from +the ordinary size classes, which are already 16-aligned, instead of the +aligned path; and `realloc` at any alignment keeps a block in place when it +fits instead of always copying. + +**Checked on real consumers, not just counted.** On 2026-09-25 SpaceDB (whole +workspace, 314 tests) and rusty_zstd (194 tests plus C-zstd cross tests) ran +on this allocator on Windows and Linux, and the Silesia corpus went through +rusty_zstd's CLI: every file at levels 1/3/9/19 and 4 threads compressed +**byte-identically** to the same CLI on 2.2.0 and round-tripped through C zstd +1.5.7 both ways (`tools/corpus/`, `docs/LEDGER.md` DOWNSTREAM CORPUS). **Where this came from: `free`.** It is the function a real program spends its allocator time in, so it is the one worth counting instruction by instruction. @@ -318,6 +374,16 @@ suite asserts the allocator *aborts* on a poisoned free list. **Portability** — x86-64 and aarch64, Linux, macOS and Windows, plus `wasm32-unknown-unknown` via `memory.grow`. +**Memory** — freed memory stays mapped and committed by default, as it does +in upstream mimalloc: `purge_delay` ships at `-1`, so a process that once held +a large peak keeps reading near that peak in `RSS` / working set afterwards +(a consumer measured 461 MB retained after freeing 456 MB of huge blocks, +where the Windows heap fell back to 4 MB — and mimalloc read the same 461 MB). +That is the trade that makes re-use fast. To hand freed spans back, set +`RUSTY_ALLOC_PURGE_DELAY` (or `MIMALLOC_PURGE_DELAY`) to a delay in +milliseconds, `0` for as soon as a span is free, or call +`options::set(15, delay)` before the first allocation. + ## Install ```toml diff --git a/bench/alignednew.cpp b/bench/alignednew.cpp new file mode 100644 index 0000000..1e134a9 --- /dev/null +++ b/bench/alignednew.cpp @@ -0,0 +1,26 @@ +// Deterministic C++17 over-aligned new/delete churn: the `align_val_t` +// operators, which a type declared `alignas(64)` (a cache-line-padded +// counter, a SIMD block) reaches on every `new`. Nothing else in the +// repository exercises them. Same two-point shape as sizedchurn.cpp: +// Ir/op = (Ir(2n) - Ir(n)) / n, argv[1] = n. +#include + +struct alignas(64) Line { unsigned char b[64]; }; +struct alignas(32) Pair { double a[4]; }; + +int main(int argc, char** argv) { + const long iters = (argc > 1) ? atol(argv[1]) : 200000; + Line* keep[64] = {}; + for (long k = 0; k < iters; k++) { + Line* l = new Line; + l->b[0] = (unsigned char)k; + Pair* p = new Pair[3]; + p[0].a[0] = (double)k; + delete[] p; + int s = (int)(k & 63); + delete keep[s]; + keep[s] = l; + } + for (auto* l : keep) delete l; + return 0; +} diff --git a/bench/fastpath-ir/Cargo.lock b/bench/fastpath-ir/Cargo.lock new file mode 100644 index 0000000..930e2af --- /dev/null +++ b/bench/fastpath-ir/Cargo.lock @@ -0,0 +1,118 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "fastpath-ir" +version = "0.0.0" +dependencies = [ + "rusty_alloc-api", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "rusty_alloc" +version = "2.2.0" +dependencies = [ + "libc", + "portable-atomic", + "windows-sys", +] + +[[package]] +name = "rusty_alloc-api" +version = "2.2.0" +dependencies = [ + "rusty_alloc", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" diff --git a/bench/fastpath-ir/Cargo.toml b/bench/fastpath-ir/Cargo.toml new file mode 100644 index 0000000..36fcdb1 --- /dev/null +++ b/bench/fastpath-ir/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "fastpath-ir" +version = "0.0.0" +edition = "2021" +publish = false + +[workspace] + +[dependencies] +rusty_alloc-api = { path = "../../crates/rusty_alloc_api" } + +[profile.release] +opt-level = 3 +lto = true +codegen-units = 1 diff --git a/bench/fastpath-ir/src/main.rs b/bench/fastpath-ir/src/main.rs new file mode 100644 index 0000000..46064dd --- /dev/null +++ b/bench/fastpath-ir/src/main.rs @@ -0,0 +1,128 @@ +//! How many INSTRUCTIONS an alloc/free pair costs, so the Xtensa CYCLE +//! figure can be read for what it is — and what a fixed-size POOL costs +//! instead. +//! +//! The A/B cell on an ESP32-S3 measures **88 cycles** for an alloc/free pair +//! at 16 bytes and **101 at 256**. Reading the fast path says it is seven +//! operations, with `free` as its mirror. Seven operations cannot cost 88 +//! cycles unless something other than instruction count sets the price, so +//! the count is worth having exactly. +//! +//! Callgrind is deterministic, so these numbers have no error bars. +//! +//! # The two arms +//! +//! * `general` — `RustyAlloc` through `GlobalAlloc`, which is what the A/B +//! cell measures and what a `Box` or a `Vec` reaches. +//! * `pool` — a fixed-size free list. **A different strategy, not a faster +//! allocator**, and it is only applicable where the size is known at +//! compile time and the capacity can be pre-sized. An RTOS is full of +//! exactly that: TCBs, queue items, timer records. It answers a narrower +//! question, which is why it can answer it in fewer instructions. +//! +//! Both do the identical surrounding work — the same write, read, `black_box` +//! and checksum — so the difference is the allocation strategy and nothing +//! else. +//! +//! # Method +//! +//! Counted at several lengths; the cost of one pair is the **slope**, so +//! process start-up, `ld.so`, allocator init and first-touch warm-up cancel +//! exactly instead of being estimated. Same shape as `bench/opscan.sh` here. +//! +//! ```sh +//! cargo build --release +//! for n in 1000000 2000000 3000000; do +//! valgrind --tool=callgrind --callgrind-out-file=/dev/null \ +//! ./target/release/fastpath-ir "$n" 256 general +//! done +//! ``` +//! +//! # What it does NOT measure +//! +//! Cycles, and so not the quantity the A/B cell reports. This is also a +//! 64-bit host, where `SMALL_SIZE_MAX` is 1 KiB rather than the 512 bytes a +//! 32-bit chip gets, so the size BOUNDARY sits elsewhere here. Only the +//! shape carries over, which is all this is asked for. + +use std::alloc::{GlobalAlloc, Layout}; + +#[global_allocator] +static ALLOC: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc; + +/// A fixed-size free list over one contiguous arena. +/// +/// No size classes, no bins, no page lookup: the block size is a constant of +/// the pool, so `alloc` is a pop and `free` is a push. The bounds checks are +/// left in — this is what a SAFE pool costs, not what an unchecked one +/// could. +struct Pool { + arena: Vec, + block: usize, + free: Vec, +} + +impl Pool { + fn new(block: usize, blocks: usize) -> Self { + Self { + arena: vec![0u8; block * blocks], + block, + // Highest offset first, so the first pop hands out offset 0. + free: (0..blocks).rev().map(|i| i * block).collect(), + } + } + + #[inline] + fn alloc(&mut self) -> Option { + self.free.pop() + } + + #[inline] + fn dealloc(&mut self, at: usize) { + self.free.push(at); + } +} + +fn main() { + let mut args = std::env::args().skip(1); + let rounds: usize = args + .next() + .and_then(|a| a.parse().ok()) + .unwrap_or(1_000_000); + let size: usize = args.next().and_then(|a| a.parse().ok()).unwrap_or(256); + let arm = args.next().unwrap_or_else(|| "general".to_owned()); + + let mut sum: u64 = 0; + + match arm.as_str() { + "pool" => { + let mut pool = Pool::new(size, 64); + for i in 0..rounds { + let at = pool.alloc().expect("the pool is not exhausted"); + if let Some(slot) = pool.arena.get_mut(at) { + *slot = (i & 0xff) as u8; + sum = sum.wrapping_add(u64::from(*slot)); + } + std::hint::black_box(at); + pool.dealloc(at); + } + } + _ => { + let layout = Layout::from_size_align(size, 8).expect("a valid layout"); + for i in 0..rounds { + // SAFETY: a non-zero layout, and the pointer is freed exactly + // once below with the layout it was allocated with. + unsafe { + let p = ALLOC.alloc(layout); + assert!(!p.is_null(), "out of memory"); + p.write((i & 0xff) as u8); + sum = sum.wrapping_add(u64::from(p.read())); + std::hint::black_box(p); + ALLOC.dealloc(p, layout); + } + } + } + } + + println!("rounds={rounds} size={size} arm={arm} checksum={sum}"); +} diff --git a/bench/rust-globalalloc.sh b/bench/rust-globalalloc.sh new file mode 100644 index 0000000..3bdaf11 --- /dev/null +++ b/bench/rust-globalalloc.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Whole-program Ir per `n` steps of the two Rust GlobalAlloc workloads +# (bench/rust-globalalloc), by the two-point estimator Ir(2n) - Ir(n), plus +# .text size. Linux/WSL with valgrind. usage: bench/rust-globalalloc.sh [n] +# +# Read WHOLE-program Ir here, not an allocator-only filter: with the +# GlobalAlloc methods inline, rustc places the allocator fast paths inside +# the program's own functions, where a per-file filter cannot see them. +# The workloads print a checksum; it must match between the arms. +set -euo pipefail +root=$(cd "$(dirname "$0")/.." && pwd) +n=${1:-20000} +tgt=${CARGO_TARGET_DIR:-$root/target/rust-globalalloc} +CARGO_TARGET_DIR=$tgt cargo build --release -q --manifest-path "$root/bench/rust-globalalloc/Cargo.toml" +for b in maps trees threads overaligned; do + bin=$tgt/release/$b + ir() { local o; o=$(mktemp); valgrind --tool=callgrind --callgrind-out-file="$o" --cache-sim=no --branch-sim=no "$bin" "$1" >/dev/null 2>&1; grep -m1 '^summary:' "$o" | awk '{print $2}'; rm -f "$o"; } + a=$(ir "$n"); c=$(ir $((n * 2))) + printf '%-6s Ir/%d steps %12d text %8d checksum %s\n' "$b" "$n" $((c - a)) \ + "$(size -A "$bin" | awk '$1==".text"{print $2}')" "$("$bin" "$n")" +done diff --git a/bench/rust-globalalloc/Cargo.lock b/bench/rust-globalalloc/Cargo.lock new file mode 100644 index 0000000..5e0516c --- /dev/null +++ b/bench/rust-globalalloc/Cargo.lock @@ -0,0 +1,118 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "rust-globalalloc" +version = "0.0.0" +dependencies = [ + "rusty_alloc-api", +] + +[[package]] +name = "rusty_alloc" +version = "2.2.0" +dependencies = [ + "libc", + "portable-atomic", + "windows-sys", +] + +[[package]] +name = "rusty_alloc-api" +version = "2.2.0" +dependencies = [ + "rusty_alloc", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" diff --git a/bench/rust-globalalloc/Cargo.toml b/bench/rust-globalalloc/Cargo.toml new file mode 100644 index 0000000..3e78da4 --- /dev/null +++ b/bench/rust-globalalloc/Cargo.toml @@ -0,0 +1,18 @@ +# Deterministic Rust workloads for the `GlobalAlloc` entry points +# (`rusty_alloc_api::RustyAlloc`), which no C instrument in this repository +# reaches: `__rust_alloc` and friends, hashbrown's 16-byte-aligned tables, +# over-aligned realloc, and the drop path. Standalone (its own workspace) so the +# main build never compiles it. Run `bench/rust-globalalloc.sh` under WSL/Linux. +[package] +name = "rust-globalalloc" +version = "0.0.0" +edition = "2024" +publish = false + +[workspace] + +[dependencies] +rusty_alloc-api = { path = "../../crates/rusty_alloc_api" } + +[profile.release] +debug = true diff --git a/bench/rust-globalalloc/src/bin/maps.rs b/bench/rust-globalalloc/src/bin/maps.rs new file mode 100644 index 0000000..0858213 --- /dev/null +++ b/bench/rust-globalalloc/src/bin/maps.rs @@ -0,0 +1,29 @@ +//! `maps`: HashMap/HashSet churn (hashbrown allocates its tables 16-byte +//! aligned), formatted Strings, a BTreeMap and a growing `Vec`. +//! Argument: step count; the harness takes Ir(2n) - Ir(n). +use std::collections::{BTreeMap, HashMap, HashSet}; + +#[global_allocator] +static A: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc; + +fn main() { + let n: u64 = std::env::args().nth(1).and_then(|s| s.parse().ok()).unwrap_or(20000); + let mut sink = 0u64; + for r in 0..n / 1000 { + // many small hash maps: hashbrown allocates with 16-byte alignment + for k in 0..200u64 { + let mut m: HashMap = HashMap::new(); + for i in 0..(k % 13) { m.insert(i * 7 + r, i); } + let s: HashSet = (0..(k % 7) as u32).collect(); + sink = sink.wrapping_add(m.len() as u64 + s.len() as u64); + } + // strings and vectors that grow (realloc) + let mut v: Vec = Vec::new(); + for i in 0..400u64 { v.push(format!("item-{i}-{r}")); } + let mut b: BTreeMap = BTreeMap::new(); + for (i, s) in v.iter().enumerate() { b.insert(s.clone(), i); } + let w: Vec = (0..(r % 50) as u128).collect(); + sink = sink.wrapping_add(b.len() as u64 + w.len() as u64); + } + println!("{sink}"); +} diff --git a/bench/rust-globalalloc/src/bin/overaligned.rs b/bench/rust-globalalloc/src/bin/overaligned.rs new file mode 100644 index 0000000..8cee5ad --- /dev/null +++ b/bench/rust-globalalloc/src/bin/overaligned.rs @@ -0,0 +1,30 @@ +//! `overaligned`: buffers of cache-line-aligned elements (align 64, above +//! what the size classes guarantee) that grow, shrink to fit and are +//! re-reserved — the `GlobalAlloc::realloc` arm for alignments above two +//! words. Argument: step count. +#[global_allocator] +static A: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc; + +#[derive(Clone, Copy)] +#[repr(align(64))] +struct Line([u64; 8]); + +fn main() { + let n: u64 = std::env::args().nth(1).and_then(|s| s.parse().ok()).unwrap_or(20000); + let mut sink = 0u64; + for r in 0..n / 20 { + let mut v: Vec = Vec::with_capacity(4); + for i in 0..(r % 29 + 3) { + v.push(Line([i; 8])); + } + // Shrink to what is used (in place when at least half stays), then + // grow back by a little (in place within the class's slack). + v.shrink_to_fit(); + v.truncate(v.len() * 3 / 4); + v.shrink_to_fit(); + v.reserve_exact(1); + v.push(Line([r; 8])); + sink = sink.wrapping_add(v.iter().map(|l| l.0[0]).sum::() + v.capacity() as u64); + } + println!("{sink}"); +} diff --git a/bench/rust-globalalloc/src/bin/threads.rs b/bench/rust-globalalloc/src/bin/threads.rs new file mode 100644 index 0000000..794ea7f --- /dev/null +++ b/bench/rust-globalalloc/src/bin/threads.rs @@ -0,0 +1,18 @@ +//! `threads`: short-lived threads, each allocating a little and exiting — +//! a blocking pool's shape. Prices per-thread heap setup and teardown, which +//! no other workload here reaches. Argument: step count (threads = n / 100). +#[global_allocator] +static A: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc; + +fn main() { + let n: u64 = std::env::args().nth(1).and_then(|s| s.parse().ok()).unwrap_or(20000); + let mut sink = 0u64; + for t in 0..n / 100 { + let h = std::thread::spawn(move || { + let v: Vec> = (0..16).map(|i| Box::new(i + t)).collect(); + v.iter().map(|b| **b).sum::() + }); + sink = sink.wrapping_add(h.join().unwrap()); + } + println!("{sink}"); +} diff --git a/bench/rust-globalalloc/src/bin/trees.rs b/bench/rust-globalalloc/src/bin/trees.rs new file mode 100644 index 0000000..6707d36 --- /dev/null +++ b/bench/rust-globalalloc/src/bin/trees.rs @@ -0,0 +1,29 @@ +//! `trees`: no hashing. Boxed trees, growing +//! byte buffers, `Rc` graphs and short-lived `Vec>`, the allocation +//! pattern of a parser or an AST pass. +use std::rc::Rc; + +#[global_allocator] +static A: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc; + +enum Node { Leaf(u64), Pair(Box, Box) } + +fn build(d: u32, s: u64) -> Box { + if d == 0 { Box::new(Node::Leaf(s)) } else { Box::new(Node::Pair(build(d - 1, s * 3), build(d - 1, s + 1))) } +} +fn sum(n: &Node) -> u64 { match n { Node::Leaf(v) => *v, Node::Pair(a, b) => sum(a).wrapping_add(sum(b)) } } + +fn main() { + let n: u64 = std::env::args().nth(1).and_then(|s| s.parse().ok()).unwrap_or(20000); + let mut sink = 0u64; + for r in 0..n / 1000 { + for k in 0..20 { sink = sink.wrapping_add(sum(&build(8, r + k))); } + let mut buf: Vec = Vec::new(); + for i in 0..3000u64 { buf.extend_from_slice(&i.to_le_bytes()[..(i % 8) as usize]); } + let shared: Vec>> = (0..300).map(|i| Rc::new(vec![i; (i % 17) as usize])).collect(); + let copies: Vec>> = shared.iter().cloned().collect(); + let rows: Vec> = (0..200u32).map(|i| (0..i % 23).collect()).collect(); + sink = sink.wrapping_add(buf.len() as u64 + copies.len() as u64 + rows.iter().map(|v| v.len() as u64).sum::()); + } + println!("{sink}"); +} diff --git a/crates/rusty_alloc/CHANGELOG.md b/crates/rusty_alloc/CHANGELOG.md index 5da82e7..1b7ec6e 100644 --- a/crates/rusty_alloc/CHANGELOG.md +++ b/crates/rusty_alloc/CHANGELOG.md @@ -9,6 +9,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- **Growing a huge block with `realloc` copied its whole reservation.** A + huge segment's page reported its usable size as the chunk-rounded + reservation minus the header — 64 MiB for a 33 MB request, 96 MiB for a + 64 MB one — and `realloc` copies `usable_size` bytes when it moves a block, + so growing a 33 MB block copied, and first-touched on both sides, twice what + the caller had written; `zalloc` on a recycled chunk zeroed the same extent. + A consumer measured the two `realloc` steps that cross the segment size at + **1.41x and 1.23x mimalloc, 0/6 pairs**, with every step below it faster + than mimalloc, and a `Vec` pushed to 64 MB at 1.23x + (`docs/plans/youslowbro.md` §3). The page now reports the request rounded + up to a slice — upstream's `psize`, and what `mi_usable_size` returns there + — while the reservation itself is unchanged. On the consumer's own + harness, pinned and ABBA-paired against the tree before the fix: see the + LEDGER entry for the numbers. `tests/alloc_core.rs::huge_usable_size_is_the_request_not_the_reservation` + pins the reported size and the bytes a move preserves. +- **The options pass made 251 allocations through the global allocator on + the first allocation of every process.** `options::ensure_init` built its + 38 x 2 environment keys with `to_uppercase` and `format!` and read them with + `std::env::var`, every one an owned `String` — inside the heap that was + still being set up, and on every short CLI run. mimalloc makes none. The + keys are now built in a stack buffer sized by the table and read through + `prim::getenv` (a raw `getenv` / `GetEnvironmentVariableA`, the calls + upstream's prim makes) into a second stack buffer, and the value grammar is + parsed in place. On the consumer's counting probe the process's start-up + went from **263 allocations to 12, which is exactly what mimalloc reads + there**. `tests/options_env.rs` proves the variables still arrive (both + prefixes, precedence, the boolean grammar, KiB scaling) from a child + process, and `rusty_alloc_api/tests/reentrancy.rs` fails the build if the + allocator ever allocates through the global allocator again while serving + a request (`docs/plans/youslowbro.md` §4). - **A cross-thread double free could hang the next collect instead of aborting.** The README says a double free aborts "on both the local and the cross-thread path". The cross-thread arm of that check lived in @@ -78,8 +108,75 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 refuses such a handle instead of installing it (OH-rusty_alloc-16, 26, 54, 58, 65, 66, 97–102). +### Performance + +- **Process start-up: the options pass walks the environment once** (Linux) + instead of calling `getenv` 76 times, each of which walked all of it — + about 25,000 fewer instructions on the first allocation of every process + (a one-line `sort` −1.6 % whole-process), more with a larger environment. + Same semantics, pinned by `tests/options_env.rs`. +- **Four more instruction-count reductions**, CURIOSITY ROUND FOUR in + `docs/LEDGER.md`: `posix_memalign` and Rust's over-aligned `alloc` carry the + aligned fast path inline (opscan `aligned` −9.2 %); a medium allocation pops + its page before collecting it (`big`/`large` −3.7 %, `mixed` −3.0 %); C++17 + aligned `new` takes the power-of-two fast path; and Rust `realloc` above + two words of alignment keeps a block in place when it fits instead of + always moving it (−27.3 % against 2.2.0 on an over-aligned buffer workload). +- **Rust programs: the `GlobalAlloc` entry points were paying for a shim + and a detour on every call** (`rusty_alloc-api`). The trait methods are now + `#[inline]`, as the `mimalloc` crate's are, so `__rust_alloc` and friends + carry the fast paths instead of jumping through the GOT to them; `dealloc` + carries the free body with its null test folded away; and layouts aligned + up to two words (16 bytes on x86-64, what every hashbrown table asks for) + are served from the ordinary size classes, which are already aligned that + far, instead of the aligned path, and can now `realloc` in place instead of + always allocating, copying and freeing. Two deterministic Rust workloads + (`bench/rust-globalalloc.sh`), measured against 2.2.0: **−21.1 %** and **−5.8 %** whole-program + instructions, for about 2–3 KB of text. `tests/natural_align.rs` pins the + alignment for every size class through alloc, alloc_zeroed and realloc. +- **Two more on the allocator core**, with the three above making up + CURIOSITY ROUND THREE in `docs/LEDGER.md`: the page-extend floor now matches upstream's + `MI_MIN_EXTEND` of four blocks (perl −454,165 whole-program, opscan + `big`/`large` −4.5 %), and span marking no longer rewrites interior slices + that already point to their span (opscan `huge` −53 %). +- **Ten deterministic instruction-count reductions** on the allocation and + free paths, each measured alone under callgrind on opscan and on real + programs; `docs/LEDGER.md` (CURIOSITY) has every number and the seven + refutations. The largest: `realloc(NULL, n)` no longer pays the moving + path's five-register frame — Lua routes every allocation through + `realloc`, and its allocator instruction count fell **39.9 %** — and + `malloc_slow` is a tail call again, which with a leaf `calloc` fast path, a + single-branch keep-one-warm test, a load-first `options::get` and a + thread-local that LLVM had hoisted above its guard takes opscan + `big`/`large` −16.5 %, `mixed` −12.9 %, `calloc` −11.9 % and `huge` −7.4 %. + No op regressed. `stats.delayed_frees` is now counted in debug builds + only, like `allocs` and `frees`. +- **Ten more, measured the same way plus Python, jq, gawk and sort** + (`docs/LEDGER.md`, CURIOSITY, ROUND TWO). Cross-thread frees are **31 % + cheaper** on opscan `xthread`: a remote free to a parked page now releases + the page to NORMAL after its one delayed-list push, as upstream mimalloc + does, so later remote frees are a single CAS onto the page's own list + instead of three CASes and a per-block drain by the owner (single-block + pages keep the delayed route; the loom model gained a case for it). + Also: `realloc` decides a move in one compare, a medium allocation whose + front page is dry grows it without re-running the heartbeat, the generic + path tail-calls page growth again, `free_general` needs no stack frame, + and `posix_memalign` / `GlobalAlloc` skip a power-of-two re-test through + the new `alloc::malloc_aligned_pow2`. perl −456,939 and Python −389,886 + whole-program instructions; opscan `big`/`large`/`mixed` read +0.7…+1.0 + on the medium-grow change against round one's intermediate state and are + still −1 % over the round. + ### Changed +- **`usable_size` (`mi_usable_size`) of a huge block is the request rounded + up to a slice, no longer the reservation.** Two behaviours follow from that + and both match upstream: a `realloc` that grows a huge block into what used + to be reported as slack now moves it instead of returning it in place, and + `expand` refuses such a growth. A shrink to at least half the request stays + in place, where before it could MOVE (a 33 MB block shrunk to 20 MB was + below half of the 64 MiB it reported). The address space reserved for a + huge block is exactly what it was. - **What was NOT taken from the Openheimer campaign, and why.** The campaign's log carries 202 findings; 139 of them are one probe — an internal `unsafe fn` handed null, `0x1`, or an address just past a diff --git a/crates/rusty_alloc/Cargo.toml b/crates/rusty_alloc/Cargo.toml index b07f5b2..9e76ed6 100644 --- a/crates/rusty_alloc/Cargo.toml +++ b/crates/rusty_alloc/Cargo.toml @@ -111,6 +111,7 @@ secure = [] [target.'cfg(windows)'.dependencies] windows-sys = { version = "0.60", features = [ "Win32_Foundation", + "Win32_System_Environment", "Win32_System_Memory", "Win32_System_SystemInformation", "Win32_System_Threading", diff --git a/crates/rusty_alloc/UNSAFE.md b/crates/rusty_alloc/UNSAFE.md index 8518a7e..b4a50f7 100644 --- a/crates/rusty_alloc/UNSAFE.md +++ b/crates/rusty_alloc/UNSAFE.md @@ -10,7 +10,7 @@ Census basis: `unsafe` occurrences in CODE per file (comments stripped; `unsafe fn` signatures and the four `unsafe impl`s included). **The baseline is now MACHINE-ENFORCED** (H-11): `tools/unsafe-census.sh` counts `unsafe` in code (comments stripped) per file against -`tools/unsafe-baseline.txt` — **928 occurrences across 23 files, 2026-09-16** +`tools/unsafe-baseline.txt` — **963 occurrences across 23 files, 2026-09-25** — and FAILS if the total grows. Growth is not forbidden, it is required to be deliberate: add the new sites here with their purpose and audit date, then re-run with `--update` in the same commit. `cargo geiger`, the registry's @@ -20,21 +20,21 @@ unsafe in DEPENDENCIES, and ours are `libc` plus bindings-only `windows-sys`. | Module | Count | What the `unsafe` is for | Last audit | |---|---:|---|---| -| `alloc.rs` | 94 | The public entry points: raw-pointer reads on the malloc fast path (must never form `&mut` on the shared empty-heap sentinel), pointer-derived metadata on the free path (`segment_of`/`page_of`), block-content copies in the realloc family. **+15 on 2026-08-22**: the free path's two `asm!` sites — the memory-destination `used--` whose flags drive the retire branch (its `label` block is a separate item and carries its own `unsafe`), and the fused `cmp {tid}, fs:0` in both `free_inline` and `free_general` — plus `malloc_or`/`malloc_or_slow`, which give `operator new` a fast path whose miss is a tail call. Each asm reads or writes exactly one field it already had a valid pointer to; none widens what the surrounding code could already touch | 2026-08-22 (free campaign; every new block reviewed at the site) | -| `heap.rs` | 71 | Owner-thread page/queue manipulation under raw pointers (no two `&mut Page` may coexist), the aligned-allocation peek, span carving. **+3 on 2026-08-19**: `try_unlink_huge_segment` split out of `remove_huge_segment`. **+15 on 2026-08-22**: `malloc_generic` split into a small entry plus `malloc_generic_walk`, with `grow_front`, `try_guarded` and `drain_delayed` as cold arms — each split adds an `unsafe fn` signature and its block while dereferencing nothing the single function did not — and the immortal `EMPTY_DELAYED` sentinel that lets the heartbeat read its list without a null test. **+2 on 2026-09-07 (P4e, §2.15 of `docs/plans/small-metal.md`)**: the reclamation fixes — one `unsafe` for the periodic `generic_collect` sweep and one for the reclaim-and-retry that runs before `malloc_generic` returns null. Both call `collect_inner`, which allocates nothing and touches only this heap’s own pages on the owner thread; each carries its SAFETY line. `malloc_generic` itself became a safe wrapper over the renamed `malloc_generic_once`, so the split added no signature. **+2 on 2026-09-08:** the medium collect-and-retry ahead of the heartbeat -- one `unsafe` around `page_collect` + `page_pop` on the bin queue front, one reading `free_is_zero` off the page just popped. Both are the SAME operations `malloc_generic_walk` performs on the same page a few lines later, on the owner thread under the heap lock: the block moves earlier, nothing new is dereferenced. Each carries its SAFETY line. **+2 on 2026-09-16 (Openheimer):** the two refuse arms in `malloc_aligned_at_slow` when `bins::aligned_at_from` reports that `block + offset + align` would wrap for a caller-chosen offset — each is one `free_local` of the block just allocated on this thread, which has not escaped | 2026-09-16 | +| `alloc.rs` | 94 | The public entry points: raw-pointer reads on the malloc fast path (must never form `&mut` on the shared empty-heap sentinel), pointer-derived metadata on the free path (`segment_of`/`page_of`), block-content copies in the realloc family. **+15 on 2026-08-22**: the free path's two `asm!` sites — the memory-destination `used--` whose flags drive the retire branch (its `label` block is a separate item and carries its own `unsafe`), and the fused `cmp {tid}, fs:0` in both `free_inline` and `free_general` — plus `malloc_or`/`malloc_or_slow`, which give `operator new` a fast path whose miss is a tail call. Each asm reads or writes exactly one field it already had a valid pointer to; none widens what the surrounding code could already touch. **+2 on 2026-09-24 (instruction-count campaign, LEDGER):** `realloc` split into an inline null test and `unsafe fn realloc_live(p: NonNull, ..)` — one signature, and the `NonNull::new_unchecked` sits inside the block that already called it, on a pointer the line above proved non-null. The body is the old one unchanged; nothing new is dereferenced. **+10 on 2026-09-24 (round two, LEDGER):** (a) `realloc_move`, the moving arm shared by the growth and the shrink — one `unsafe fn`, its body block, and the two call-site blocks: the old inline move code, now reached with the copy length each arm already holds; (b) `zalloc` in `malloc`'s raw-read shape — its fast-path block reads through `hb`, which may be the sentinel, exactly as `malloc` does (no `&mut`, no write unless a block was popped, which proves the heap is real), and the cold `unsafe fn zalloc_slow` that performs the sentinel test the fast path dropped (signature + block); (c) `free_local_owned` / `free_local_no_xheap`, `owner_heap` split so its heap-creating fallback is a tail call — two signatures and their two blocks, the same loads and the same `free_local_at` as before; (d) `malloc_aligned_pow2`, an `unsafe fn` only because its caller must have proven the alignment a power of two (a violation is not memory-unsafe — the bound test still refuses a mask at or above half a segment). Nothing new is dereferenced anywhere; each carries its SAFETY line | 2026-09-24 | +| `heap.rs` | 77 | Owner-thread page/queue manipulation under raw pointers (no two `&mut Page` may coexist), the aligned-allocation peek, span carving. **+3 on 2026-08-19**: `try_unlink_huge_segment` split out of `remove_huge_segment`. **+15 on 2026-08-22**: `malloc_generic` split into a small entry plus `malloc_generic_walk`, with `grow_front`, `try_guarded` and `drain_delayed` as cold arms — each split adds an `unsafe fn` signature and its block while dereferencing nothing the single function did not — and the immortal `EMPTY_DELAYED` sentinel that lets the heartbeat read its list without a null test. **+2 on 2026-09-07 (P4e, §2.15 of `docs/plans/small-metal.md`)**: the reclamation fixes — one `unsafe` for the periodic `generic_collect` sweep and one for the reclaim-and-retry that runs before `malloc_generic` returns null. Both call `collect_inner`, which allocates nothing and touches only this heap’s own pages on the owner thread; each carries its SAFETY line. `malloc_generic` itself became a safe wrapper over the renamed `malloc_generic_once`, so the split added no signature. **+2 on 2026-09-08:** the medium collect-and-retry ahead of the heartbeat -- one `unsafe` around `page_collect` + `page_pop` on the bin queue front, one reading `free_is_zero` off the page just popped. Both are the SAME operations `malloc_generic_walk` performs on the same page a few lines later, on the owner thread under the heap lock: the block moves earlier, nothing new is dereferenced. Each carries its SAFETY line. **+2 on 2026-09-16 (Openheimer):** the two refuse arms in `malloc_aligned_at_slow` when `bins::aligned_at_from` reports that `block + offset + align` would wrap for a caller-chosen offset — each is one `free_local` of the block just allocated on this thread, which has not escaped. **+1 on 2026-09-24 (instruction-count campaign, LEDGER):** the medium collect-and-retry's `page_collect` + `page_pop` block became two blocks so the `saw_remote_free` latch is stored between them — same two calls on the same page, owner thread, in the same order; nothing new is dereferenced. **+1 on 2026-09-24 (round two):** a medium miss grows the front page directly — one block around the `capacity < reserved` test and the `grow_front` call, on the same page the block above just collected, which is `grow_front`'s whole contract **+2 on 2026-09-25 (CURIOSITY ROUND FOUR):** the medium arm pops the front page BEFORE collecting it — one `page_pop` block and the `free_is_zero` read beside it, the same two operations the collect-then-pop below already performs on the same owner-thread page | 2026-09-25 | | `init.rs` | 42 | Thread/heap lifecycle: the initial-exec TLS slot (`global_asm!` + fs-relative asm reads), thread-pointer register reads (`fs:0`/`gs:0x30`/`tpidrro_el0`), heap-box creation/teardown, the abandonment path run inside platform TLS destructors. **+1 on 2026-09-09 (`firmware-what-is-left.md` §7.3): an ATTRIBUTE, not an operation** — `unsafe(link_section = ".rodata.…")` on `EMPTY_HEAP_BOX`, bare metal only, so the never-written sentinel lives in flash instead of costing 1,752 bytes of RAM. The token is counted because the census is a text search; the contract it rests on (raw reads only, no page ever stores its address) is the one the `Sync` impl below already carries, and a write would now fault against the flash cache instead of silently landing. `create_heap`'s template copy from it is a `ptr::read` inside the block that already existed. **+5 on 2026-09-16 (Openheimer, OH-rusty_alloc-13):** thread exit now abandons EVERY heap the dying thread still owns, not only the one in `done_slot` — a first-class heap that was never `heap_delete`d, or one installed with `set_default_heap`, used to stay DELAYED under a dead owner forever. `take_heap_owned_by` unlinks one such box under `HEAPS_LOCK` (one block: the registry walk); `thread_done` reads `owner_tid` off its own box and calls the split-out `unsafe fn thread_done_one` for the primary box and for each extra one (three sites plus the signature). Nothing new is dereferenced that the single function did not; each carries its SAFETY line | 2026-09-16 | | `segment.rs` | 35 | Segment/page metadata addressing: the mask trick (`segment_of`), `page_of`'s contract-based indexing — **the bound is now PROVED for every in-segment offset by `proofs.rs` (Kani), not merely asserted** — span tiling, purge/recommit | 2026-08-19 | -| `prim/windows.rs` | 33 | OS FFI: VirtualAlloc family, FLS destructors, QPC, BCryptGenRandom. **+3 on 2026-09-16 (Openheimer):** `range_is_reserved` (`zeroed` `MEMORY_BASIC_INFORMATION` + `VirtualQuery`, the same OS answer `unix.rs` gets from `mincore`), and `alloc_aligned` now refuses a garbage alignment and a `size + align` that wraps BEFORE it reserves anything, and releases a re-reservation that the OS placed anywhere but the aligned address it asked for instead of returning it misaligned (`VirtualFree`, one block) | 2026-09-16 | +| `prim/windows.rs` | 34 | OS FFI: VirtualAlloc family, FLS destructors, QPC, BCryptGenRandom. **+3 on 2026-09-16 (Openheimer):** `range_is_reserved` (`zeroed` `MEMORY_BASIC_INFORMATION` + `VirtualQuery`, the same OS answer `unix.rs` gets from `mincore`), and `alloc_aligned` now refuses a garbage alignment and a `size + align` that wraps BEFORE it reserves anything, and releases a re-reservation that the OS placed anywhere but the aligned address it asked for instead of returning it misaligned (`VirtualFree`, one block). **+1 on 2026-09-24 (`docs/plans/youslowbro.md` §4):** `getenv` — one `GetEnvironmentVariableA` into a caller buffer of exactly the length passed, the allocation-free environment read that replaced `std::env::var`'s owned strings in the options pass (251 allocations through the global allocator on every process's first allocation, now none) | 2026-09-24 | | `page.rs` | 38 | Free-list links written into dead blocks, the lock-free `xthread_free` four-state protocol (loom-modeled in `tests/loom_xthread.rs`), the immortal `EMPTY_PAGE` sentinel — **+1 on 2026-09-09: the same `unsafe(link_section)` attribute as `init.rs`, placing it in flash on bare metal; its free list is permanently null, so nothing writes it**. **+8 on 2026-08-22**: `page_link_local` split out of `page_push_local` so the caller can decrement `used` in one memory-destination RMW, `page_collect_impl` const-generic over whether it also writes the protocol flag, and `USED_OFFSET` — whose value is asserted against `offset_of!(Page, used)` by a unit test, because an asm operand is not type-checked and a field reordering would silently decrement the wrong bytes | 2026-08-22 (free campaign) | -| `prim/unix.rs` | 28 | OS FFI: mmap family, madvise/decommit, pthread keys, /dev/urandom. **+1 on 2026-09-16 (Openheimer, OH-201):** `range_is_reserved` asks `mincore` whether a caller-supplied `manage_os_memory` range is mapped at all before it becomes an arena — one FFI call on a page-aligned probe | 2026-09-16 | +| `prim/unix.rs` | 31 | OS FFI: mmap family, madvise/decommit, pthread keys, /dev/urandom. **+1 on 2026-09-16 (Openheimer, OH-201):** `range_is_reserved` asks `mincore` whether a caller-supplied `manage_os_memory` range is mapped at all before it becomes an arena — one FFI call on a page-aligned probe. **+1 on 2026-09-24 (`docs/plans/youslowbro.md` §4):** `getenv` — `libc::getenv` and a byte-by-byte read of the returned C string up to its NUL or the caller buffer's end, nothing written through it; the same call upstream's prim makes, with the same standing caveat about a concurrent `setenv` **+2 on 2026-09-25:** `env_for_each` — an `unsafe extern "C"` declaration of `environ` and one block that walks it to its NULL terminator, handing each NUL-terminated entry on as a pointer; read only, with the same concurrent-`setenv` caveat as `getenv` | 2026-09-25 | | `prim/mod.rs` | 18 | The `TlsSlot` abstraction (`unsafe impl Send/Sync`, justified at the impls), dispatch to the platform backends | 2026-08-08 | -| `rusty_alloc_api/src/lib.rs` | 14 | The `GlobalAlloc`/`Allocator` impls forwarding layouts to the core; `unsafe` is inherent to those traits' contracts | 2026-08-19 | +| `rusty_alloc_api/src/lib.rs` | 16 | The `GlobalAlloc`/`Allocator` impls forwarding layouts to the core; `unsafe` is inherent to those traits' contracts . **+1 on 2026-09-24:** `GlobalAlloc::alloc`'s over-aligned arm calls `alloc::malloc_aligned_pow2`, an `unsafe fn` whose one added precondition — a power-of-two alignment — `Layout` guarantees **+1 on 2026-09-25:** the over-aligned `realloc` arm reads `usable_size(ptr)` to keep a block in place — `ptr` is a live non-null block of ours by the `GlobalAlloc` contract | 2026-09-25 | | `os.rs` | 12 | The prim-layer wrapper: commit/decommit/protect plumbing | 2026-08-08 | | `prim/mock.rs` | 8 | Miri-only mock OS backend (never shipped; `cfg(miri)`) | 2026-08-06 | | `arena.rs` | 15 | Lock-free chunk bitmap claim/verify, recycled-chunk scrubbing (the 0.1.0-alpha.2 UAF fix lives here: `wait_no_remote_in_flight` on every recycle path). The baseline had drifted to 13 without a row edit; recorded now. **+2 on 2026-09-16 (Openheimer, `docs/plans/openheimer-run.md`):** `arena_register` claims its slot with a CAS instead of a load-then-store, and the two new blocks are the REFUSE arm — `os::free` of the descriptor and of the OS mapping when the table is full or the slot was lost — so a refused arena leaks nothing. Both free memory this function allocated a few lines earlier and nothing else has seen; each carries its SAFETY line | 2026-09-16 | | `prim/fixed.rs` | 37 | **New 2026-09-07 (P1 of `docs/plans/small-metal.md`).** The fixed-region backend for a target with no OS: memory is a `&'static mut [u8]` handed over once. **6 of the 18 are `unsafe fn` signatures the prim seam requires** (`alloc`/`free`/`commit`/`decommit`/`reset`/`protect`) whose *bodies contain no unsafe operation at all* — the free list is `AtomicUsize` arrays under a spin lock and the pointers are built with the safe `with_exposed_provenance_mut`, so this backend adds **zero** unsafe dereferences to the shipped crate. The other 12 are in `#[cfg(test)]`: two `&raw mut` static-region handoffs and ten calls through the `unsafe fn` seam, each with its SAFETY line. **+1 on 2026-09-07 (P2):** the region test became two-sided — where the shipped geometry refuses a segment-sized request from a 512 KiB region, the small profile SERVES one, so the test now frees it too. Audited at the site; the module is `allow(dead_code)` and unreachable on every platform that has an arm above it. **+7 on 2026-09-07 (P4b, §2.9/§2.10 of the same plan):** the two-ended `place` rule added ZERO unsafe to shipped code — `place` is a pure arithmetic `fn` and the scan around it is unchanged — and all seven are in `#[cfg(test)]`: one `slice::from_raw_parts_mut` carving the `REGION_ALIGN`-aligned window out of `BACKING` (replacing a `&mut *ptr` that a `repr(align(65536))` static would have needed, which rustc 1.97.1 on MSVC cannot compile), one `ptr::add` to reach that window, and five calls through the `unsafe fn` seam in the placement assertions and in `greedy_segments`, which allocates segments until refusal and frees every one before returning. Each carries its SAFETY line **+1 on 2026-09-09 (morning, `#21`):** the two-sided alignment test frees the SEGMENT_SIZE-aligned page it is served when the region straddles a boundary — `#[cfg(test)]`, banked without a row here at the time; recorded now. **+5 on 2026-09-09 (`docs/plans/finished/region-alignment-bug.md` §7): the module ships its first unsafe OPERATIONS.** (1) `unsafe impl Sync for Region` and (2) the `&mut *self.bytes.get()` in `Region::give` — the once-only handoff the Janus seam has carried since 2.0.0, moved here so the alignment travels with it; a module-wide `REGION_GIVEN` swap precedes the `&mut`, so a second `give` on any instance is refused before it could alias. (3) `unsafe impl Sync for FirstHeapBox`, the bare-metal static holding the first heap's descriptor (handed out once by `take_first_heap_box`, on the one thread such a build has). The other two are `#[cfg(test)]`: a `from_raw_parts_mut` carving the report's misaligned base out of a static for the refusal probe, and a `Box::new_zeroed().assume_init()` allocating a `Region` in place, because materialising a 64 KiB-aligned value on the stack first faults on Windows. Each carries its SAFETY line. **+2 on 2026-09-09 (`docs/plans/finished/region-alignment-dissolve.md`): zero new unsafe in shipped code** — segments now stride from the region's base, and every piece of that is safe: `stride_base` is a relaxed load, `place` takes an `origin` and does arithmetic, `install_region` aligns the base up. The two are `#[cfg(test)]`, the `--cfg ra_aligned_region` arm of the two-sided alignment test (an `alloc` and a `free` through the `unsafe fn` seam: the 2.0.4 straddle case, kept under the knob that restores the mask), and the `Box::new_zeroed().assume_init()` moved under that same cfg — the default arm is a plain `static Region` now, which a 16-byte-aligned type can be on every host toolchain. Each carries its SAFETY line. **+4 on 2026-09-09 (`docs/plans/finished/esp32-large-alloc-ceiling.md`): all four are `#[cfg(test)]`, and shipped code gained none.** The large-allocation ceiling reported from `rusty_zstd` is reproduced against the real extent allocator by `greedy_dedicated`, which serves `huge_alloc`-shaped reservations until the region refuses and frees every one before returning (two calls through the `unsafe fn` seam), plus one `alloc`/`free` pair modelling the whole segment a first small allocation claims. The fix itself -- the `ra_segment_size` geometry knob, `dedicated_segments`, `region_for_allocs` and `region_capacity` -- is arithmetic over the existing atomics and adds no unsafe operation at all. Each carries its SAFETY line | 2026-09-09 | | `prim/wasm.rs` | 6 | `memory.grow` linear-memory backend | 2026-08-06 | -| `options.rs` | 6 | Env parsing at init, registered-hook invocation | 2026-08-06 | +| `options.rs` | 17 | Env parsing at init, registered-hook invocation. **+1 on 2026-09-24: `#[cfg(test)]` only** — `std::env::set_var` (an `unsafe fn` in edition 2024) seeding two probe variables for the in-place lookup test. Shipped code gained none: the pass itself went from 251 allocations to zero by building its keys in a stack buffer and reading through `prim::getenv` **+10 on 2026-09-25:** the one-walk environment pass (Linux) — three `unsafe fn` helpers (`strip`, `match_name`, `copy_value`) that read a NUL-terminated entry byte by byte and stop at the first mismatch or its NUL, and the blocks that call them; nothing is written through an entry | 2026-09-25 | | `stats.rs` | 3 | Volatile whole-struct snapshot of racy-by-design counters | 2026-08-06 | | `random.rs` | 2 | OS entropy seeding via the prim layer | 2026-08-08 | | `lib.rs` | 2 | **New 2026-09-07 (P3).** One `unsafe impl Sync for SingleThreadCell` — the `no_std` half of `ra_thread_local!`. With `std` the macro is `std::thread_local!` verbatim and this type does not exist; without it, a "thread-local" is a plain `static`, sound because the crate serves `no_std` only on single-threaded targets (the same standing assumption as `prim::fixed`: constant thread id, TLS destructors that never fire, a spin lock that never contends). A `no_std` build on a target that grows threads must revisit this type first — the SAFETY comment says so at the impl. **+1 on 2026-09-07 (P5): PROSE, not code.** The census is a text search, and the `compile_error!` that now forces `--cfg ra_single_threaded` on a `no_std` build names `unsafe impl Sync` in its message so the person who hits it knows what they are opting into. Counted, and left counted rather than reworded: the ratchet is allowed to be conservative, and a message that names the thing is worth one line of baseline | 2026-09-07 (P5) | @@ -50,7 +50,7 @@ comment, and all four are in the H-11 ratchet's baseline. | Module | Count | What the `unsafe` is for | Last audit | |---|---:|---|---| -| `rusty_alloc_ffi/src/lib.rs` | 350 | **The workspace's untrusted boundary**: 157 `extern "C"` entry points receiving caller pointers and sizes. Every out-parameter writer null-guards; `mi_posix_memalign` validates alignment (power of two, ≥ `sizeof(void*)`) and returns EINVAL/ENOMEM; all 8 `count × size` sites use `checked_mul`. Panics cannot unwind into C (edition 2024 aborts on `extern "C"` unwind; release is `panic = "abort"`). **+2 on 2026-08-22**: `new_impl` routes through `alloc::malloc_or` so the OOM arm is a tail call rather than a null test that keeps `size` live. **+6 on 2026-09-16 (Openheimer, `docs/plans/openheimer-run.md`):** `heap_ptr` — one `unsafe fn` plus its deref — is now the ONE place a C heap handle is turned into a `Heap`, after a null / misaligned / immortal-empty-box check (shape only: what a well-formed handle points at is the caller's, as for `free`); and `mi_dupenv_s` / `mi_wdupenv_s` write null and 0 through the caller's out-pointers on the EINVAL path (four writes) instead of leaving them untouched, as the CRT contract says. Every out-parameter write in the crate goes through `out_mut`, which refuses null and misaligned pointers; the 64 KiB address floor it briefly carried is gone, because it would have refused legitimate out-pointers on wasm32, where static data starts at 1 KiB | 2026-09-16 | +| `rusty_alloc_ffi/src/lib.rs` | 358 | **The workspace's untrusted boundary**: 157 `extern "C"` entry points receiving caller pointers and sizes. Every out-parameter writer null-guards; `mi_posix_memalign` validates alignment (power of two, ≥ `sizeof(void*)`) and returns EINVAL/ENOMEM; all 8 `count × size` sites use `checked_mul`. Panics cannot unwind into C (edition 2024 aborts on `extern "C"` unwind; release is `panic = "abort"`). **+2 on 2026-08-22**: `new_impl` routes through `alloc::malloc_or` so the OOM arm is a tail call rather than a null test that keeps `size` live. **+6 on 2026-09-16 (Openheimer, `docs/plans/openheimer-run.md`):** `heap_ptr` — one `unsafe fn` plus its deref — is now the ONE place a C heap handle is turned into a `Heap`, after a null / misaligned / immortal-empty-box check (shape only: what a well-formed handle points at is the caller's, as for `free`); and `mi_dupenv_s` / `mi_wdupenv_s` write null and 0 through the caller's out-pointers on the EINVAL path (four writes) instead of leaving them untouched, as the CRT contract says. Every out-parameter write in the crate goes through `out_mut`, which refuses null and misaligned pointers; the 64 KiB address floor it briefly carried is gone, because it would have refused legitimate out-pointers on wasm32, where static data starts at 1 KiB . **+1 on 2026-09-24:** `posix_memalign` calls `alloc::malloc_aligned_pow2` after its own EINVAL test has proven the alignment a power of two, so the core skips re-testing it **+1 on 2026-09-25:** C++ aligned `new` calls `malloc_aligned_pow2` after testing `align & (align - 1) == 0` itself; an invalid alignment keeps the old checked route | 2026-09-25 | | `rusty_alloc_override/src/lib.rs` | 51 | `malloc`/`free`/`operator new` interposition for `LD_PRELOAD` — thin forwarding to `alloc::*`, plus the `free_inline` export that carries the fast-path body. No state of its own. **+2 on 2026-08-22**: the sized-delete exports follow the same `free_inline` shape as the unsized ones | 2026-08-22 | | `rusty_alloc_bench/src/*.rs` | 29 | Tier-B kernels and the `.ratrace` replayer. The trace parser's `unwrap`s are infallible by TYPE (`Record::decode` takes `&[u8; RECORD_SIZE]`), and the one genuinely-invalid field returns `InvalidData` | 2026-08-20 (first audit) | | `rusty_alloc_wasm/src/lib.rs` | 21 | The `ra_selftest` cdylib fixture: raw block writes and read-back checks that prove the wasm build actually allocates | 2026-08-20 (first audit) | diff --git a/crates/rusty_alloc/src/alloc.rs b/crates/rusty_alloc/src/alloc.rs index 106a871..65d42d7 100644 --- a/crates/rusty_alloc/src/alloc.rs +++ b/crates/rusty_alloc/src/alloc.rs @@ -68,6 +68,41 @@ unsafe fn unalign(pg: *mut Page, p: *mut u8) -> *mut u8 { } } +/// `free_local_at` on the owning heap, for [`free_general`]'s local arm. +/// +/// [`owner_heap`] inlined there carried its fallback — `my_heap()`, which can +/// CREATE the heap — as a non-tail call, and that one call gave +/// `free_general` a three-register frame paid by every general free, +/// including the cross-thread frees it hands to `remote_free` and never +/// reach this arm (callgrind, opscan `xthread`). Here the common case is a +/// tail call and the fallback is its own cold function. +/// +/// # Safety +/// As [`owner_heap`] and `Heap::free_local_at`. +#[inline(always)] +unsafe fn free_local_owned(seg: *mut Segment, pg: *mut Page, block: *mut u8) { + // SAFETY: forwarded contract. + unsafe { + let xh = (*pg).xheap.load(core::sync::atomic::Ordering::Acquire); + if xh == 0 { + return free_local_no_xheap(seg, pg, block); + } + (*(*init::box_of_xheap(xh)).heap.get()).free_local_at(seg, pg, block); + } +} + +/// [`owner_heap`]'s fallback arm, out of line so its call stays out of +/// `free_general`'s frame. +/// +/// # Safety +/// As [`free_local_owned`]. +#[cold] +#[inline(never)] +unsafe fn free_local_no_xheap(seg: *mut Segment, pg: *mut Page, block: *mut u8) { + // SAFETY: forwarded contract. + unsafe { (*owner_heap(pg)).free_local_at(seg, pg, block) }; +} + /// The heap that OWNS `pg` — recovered from the page's `xheap` back-pointer /// (container-of over the `HeapBox`'s offset-0 delayed list), so it is right /// even when the thread holds several first-class heaps. @@ -355,13 +390,52 @@ pub fn zalloc(size: usize) -> *mut u8 { // sentinel, and so carries the once-per-thread initialisation and a null // check for its failure on a path taken once per ALLOCATION. `rptest` // calls calloc 43,449 times and paid it on every one. + // + // And no compare against the sentinel either, now: the fast path is + // `malloc`'s — RAW reads only, so `hb` may be the sentinel, whose direct + // table of empty pages always misses — and the sentinel test moved into + // the cold miss. It was a `cmp; je` on every `calloc` (Python: 60,336 of + // them in the real-program gate) for a case that a miss already routes. + // The zeroing keeps the popped page in hand, as `Heap::zalloc` does + // (opps.md #5). let hb = init::heap_box_fast(); + // SAFETY: raw reads only, exactly as `malloc`: `direct` entries point at a + // live page of this thread's heap or at the immortal empty page, and + // `page_pop` on that returns null before its first store. A non-null + // block means `hb` is this thread's real heap. + unsafe { + if size <= SMALL_SIZE_MAX { + let w = crate::types::wsize_from_size(size); + let h = (*hb).heap.get(); + let p = (*h).direct[w]; + let b = crate::page::page_pop(p); + if !b.is_null() { + #[cfg(debug_assertions)] + { + (*h).stats.allocs += 1; + } + if (*p).free_is_zero { + b.cast::().write(0); + } else { + ptr::write_bytes(b, 0, (*p).block_size); + } + return b; + } + } + zalloc_slow(hb, size) + } +} + +/// [`zalloc`]'s miss: the sentinel test, then the heap's own zalloc. +/// +/// # Safety +/// `hb` is `heap_box_fast()` of the calling thread. +#[cold] +#[inline(never)] +unsafe fn zalloc_slow(hb: *mut init::HeapBox, size: usize) -> *mut u8 { if hb == init::empty_heap_box_ptr() { return zalloc_first(size); } - // `Heap::zalloc` zeroes with the popped page in hand, avoiding the - // `usable_size` re-resolution the old `malloc` + `zero_block` pair paid on - // every recycled block (opps.md #5). // SAFETY: a non-sentinel box is this thread's live, initialised box. unsafe { (*(*hb).heap.get()).zalloc(size) } } @@ -436,6 +510,29 @@ pub fn malloc_aligned(size: usize, align: usize) -> *mut u8 { // reverted. The export gains a frame worth more than the check it removes, // the same result the `realloc_inline` twin produced. pub fn malloc_aligned_at(size: usize, align: usize, offset: usize) -> *mut u8 { + aligned_at_impl::(size, align, offset) +} + +/// [`malloc_aligned`] for a caller that has ALREADY established that `align` +/// is a power of two: the C shims that validate it for EINVAL +/// (`posix_memalign`), and Rust's `GlobalAlloc`, whose `Layout` guarantees +/// it. The public entry re-tested it on every call — a `test; jne` after the +/// mask it needs anyway (callgrind, opscan `aligned`). +/// +/// # Safety +/// `align` must be a power of two. (A violation is not memory-unsafe here — +/// the bound test still refuses a mask at or above half a segment — but the +/// block would not be aligned as asked.) +#[inline] +pub unsafe fn malloc_aligned_pow2(size: usize, align: usize) -> *mut u8 { + debug_assert!(align.is_power_of_two(), "malloc_aligned_pow2: {align}"); + aligned_at_impl::(size, align, 0) +} + +/// The aligned fast path; `POW2` skips the power-of-two test for callers that +/// have proven it. +#[inline(always)] +fn aligned_at_impl(size: usize, align: usize, offset: usize) -> *mut u8 { let hb = init::heap_box_fast(); // SAFETY: raw reads only, exactly as `malloc` does — `hb` may be the // shared immortal sentinel, which must never see a `&mut` or a write. Its @@ -454,7 +551,7 @@ pub fn malloc_aligned_at(size: usize, align: usize, offset: usize) -> *mut u8 { if offset == 0 && size <= SMALL_SIZE_MAX && mask < crate::types::SEGMENT_SIZE / 2 - && align & mask == 0 + && (POW2 || align & mask == 0) { let h = (*hb).heap.get(); let w = crate::types::wsize_from_size(size); @@ -990,10 +1087,17 @@ pub unsafe fn free_inline(p: *mut u8) { // `unsafe`; it is a separate item. // SAFETY: `pg` is the live page this free resolved, // owned by this thread. + // + // ONE test, not three: `used`, `next` and `prev` + // OR-ed are zero exactly when the page emptied + // (not a wrapped double free) and is its queue's + // only member. Three compare-and-branch pairs + // were 6 Ir on every free that empties a page — + // every free of an alloc/free loop cycling one + // block. `retire_or_abort` re-tests each case. unsafe { - if (*pg).used == 0 - && (*pg).next.is_null() - && (*pg).prev.is_null() + if ((*pg).used as usize | (*pg).next.addr() | (*pg).prev.addr()) + == 0 { return; } @@ -1008,7 +1112,8 @@ pub unsafe fn free_inline(p: *mut u8) { let u = (*pg).used.wrapping_sub(1); (*pg).used = u; if (u as i32) <= 0 { - if u == 0 && (*pg).next.is_null() && (*pg).prev.is_null() { + // One test, as in the x86-64 arm above. + if (u as usize | (*pg).next.addr() | (*pg).prev.addr()) == 0 { return; } return retire_or_abort(pg); @@ -1169,12 +1274,12 @@ unsafe fn free_general(p: *mut u8, seg: *mut Segment, pg: *mut Page, owner_tid: options(nostack, readonly), ); // Fell through: this thread owns the page. - (*owner_heap(pg)).free_local_at(seg, pg, block); + free_local_owned(seg, pg, block); } #[cfg(not(all(target_arch = "x86_64", target_os = "linux", not(miri))))] if crate::ONE_THREAD || owner_tid == init::thread_id() { // Hand the already-resolved segment through (M9 brick #2). - (*owner_heap(pg)).free_local_at(seg, pg, block); + free_local_owned(seg, pg, block); } else { // Remote: the loom-modeled protocol (huge pages sit DELAYED, so // this lands on the owner's delayed list and the owner's @@ -1258,16 +1363,57 @@ unsafe fn usable_size_slow(pg: *mut Page, p: *const u8, flags: u8) -> usize { /// /// # Safety /// `p` must be null or a live pointer from this allocator; invalidated on move. +/// +/// **The null test is in front of the frame, and that is the whole reason +/// this is two functions.** In one body, LLVM placed the move arm's five +/// callee-saved pushes BEFORE `test %rdi,%rdi`, so `realloc(NULL, n)` paid ten +/// frame instructions to reach a tail call into `malloc`. That is not a corner +/// case: Lua's allocator routes every allocation through `realloc`, and in the +/// `lua` real-program instrument **480,342 of 540,393 calls had a null +/// pointer** (callgrind, per instruction). Here the null arm inlines `malloc`'s +/// fast path with no frame, and a live pointer costs one `jmp` into +/// [`realloc_live`] with its arguments already in place. +#[inline] pub unsafe fn realloc(p: *mut u8, newsize: usize) -> *mut u8 { if p.is_null() { return malloc(newsize); } + // SAFETY: forwarded contract; `p` is non-null here. + unsafe { realloc_live(ptr::NonNull::new_unchecked(p), newsize) } +} + +/// [`realloc`] of a non-null pointer. +/// +/// `NonNull`, not `*mut u8`, and it is measured: split out with a raw pointer, +/// LLVM no longer knew `p` was non-null in here, and the null tests inside the +/// inlined `usable_size` and `free_inline` came back — two `test; je` pairs +/// per moving realloc, opscan `realloc` +11.84 Ir/op. The `nonnull` parameter +/// attribute folds both away again. +/// +/// # Safety +/// `p` must be a live pointer from this allocator; invalidated on move. +#[inline(never)] +unsafe fn realloc_live(p: ptr::NonNull, newsize: usize) -> *mut u8 { + let p = p.as_ptr(); // SAFETY: p live per contract. let usable = unsafe { usable_size(p) }; // NOTE: rewriting this as the one-compare unsigned range check // `newsize.wrapping_sub(usable >> 1) <= usable - (usable >> 1)` measured // FLAT — LLVM already emits that shape from the readable form. - if newsize <= usable && newsize >= usable / 2 { + // + // GROWTH first, on its own move path. A live realloc from a real program + // almost always MOVES — lua's grow, and Python's shrink below half + // (60,100 of its 60,669 took the second arm below) — and the two-sided + // test compiled branch-free — `setbe`, `shr`, `setae`, `test`, `je` — so + // every move paid all of it (callgrind, per instruction). As two + // branches each move arm decides in one compare, and each knows its copy + // length outright (`usable` for a growth, `newsize` for a shrink), so the + // `min` goes too. + if newsize > usable { + // SAFETY: forwarded contract; a growth copies the whole old block. + return unsafe { realloc_move(p, newsize, usable) }; + } + if newsize >= usable / 2 { // Keep in place. NOTE: this counter costs a TLS heap lookup (a call // into ld.so's __tls_get_addr in a cdylib) on the most common realloc // outcome, so removing it was tried as a brick -- and measured FLAT on @@ -1283,13 +1429,26 @@ pub unsafe fn realloc(p: *mut u8, newsize: usize) -> *mut u8 { // **+12.00 Ir/op** and was reverted. The argument setup plus the call and // return are paid on every MOVING realloc, and the scan is all moves; the // frame it saved was smaller than the call it added. + // A shrink below half: the copy is the new, smaller size. + // SAFETY: forwarded contract. + unsafe { realloc_move(p, newsize, newsize) } +} + +/// The moving arm of [`realloc_live`]: allocate `newsize`, copy `copy` bytes, +/// free `p`. Inlined into both of its call sites, so each copy length is a +/// value the site already holds. +/// +/// # Safety +/// `p` live from this allocator; `copy <= min(usable_size(p), newsize)`. +#[inline(always)] +unsafe fn realloc_move(p: *mut u8, newsize: usize, copy: usize) -> *mut u8 { let np = malloc(newsize); if np.is_null() { return ptr::null_mut(); } // SAFETY: both live and disjoint; prefix preserved then p consumed. unsafe { - core::ptr::copy_nonoverlapping(p, np, usable.min(newsize)); + core::ptr::copy_nonoverlapping(p, np, copy); // `free_inline`, not the outlined `free`: this function has ALREADY // masked `p` to its segment for `usable_size`, and inlining the free // here lets LLVM common-subexpression that away instead of masking @@ -1297,6 +1456,15 @@ pub unsafe fn realloc(p: *mut u8, newsize: usize) -> *mut u8 { // pass the segment explicitly was tried first and cost +1 Ir on EVERY // free (batch_lifo 60.00 -> 61.00); letting the inliner find it costs // other callers nothing because only this one opts in. + // + // REFUTED (2026-09-24): resolving this free's page, flags and owner + // BEFORE the copy, so the opaque `memcpy` would not force LLVM to + // re-derive them after it (five instructions per move). `free` stayed + // byte-identical, but LLVM re-loaded the page index before the copy + // anyway (the `malloc` above may write memory), and holding four + // values across the call took a sixth callee-saved register plus a + // stack adjustment: opscan `realloc` +8.00 (+4 per move), lua + // +240,221 and python +302,857 allocator Ir. free_inline(p); stat_realloc(false); } diff --git a/crates/rusty_alloc/src/bins.rs b/crates/rusty_alloc/src/bins.rs index 8b360f2..2ac7faa 100644 --- a/crates/rusty_alloc/src/bins.rs +++ b/crates/rusty_alloc/src/bins.rs @@ -32,7 +32,16 @@ pub fn bin(size: usize) -> usize { } else { // Four bins per power of two: index by the top bit and the next two. let w = wsize - 1; - let b = (usize::BITS - 1 - w.leading_zeros()) as usize; // bsr(w) + // bsr(w). + // + // NOTE (2026-09-24, REFUTED): `(w | 1).leading_zeros()`, to let LLVM + // see a non-zero input and drop the zero-input fallback (`mov $0x7f` + // before the `bsr`) on the generic path's medium trip, removed the + // `mov` and added a register copy and the `or`; LLVM keeps the + // `leading_zeros` form either way (`bsr; xor $0x3f`) because the shift + // count and the bin index are both derived from it. Opscan `big` + // +1.00, `aligned` +0.69, `mixed` +0.72. Leave it as written. + let b = (usize::BITS - 1 - w.leading_zeros()) as usize; ((b << 2) + ((w >> (b - 2)) & 0x03)) - 3 } } diff --git a/crates/rusty_alloc/src/heap.rs b/crates/rusty_alloc/src/heap.rs index d735615..a6927f5 100644 --- a/crates/rusty_alloc/src/heap.rs +++ b/crates/rusty_alloc/src/heap.rs @@ -4,9 +4,17 @@ //! own heap, `free` routes by the segment's owner id, and cross-thread frees go //! through the loom-modeled 4-state protocol in `page.rs`. +use core::cell::Cell; use core::ptr; use core::sync::atomic::Ordering; +ra_thread_local! { + /// Set while `Heap::malloc_generic_retry` runs its one reclaim-and-retry, + /// so a second null from the nested pass ends the attempt. Read only on + /// the OOM path; see `Heap::malloc_generic` for why it is not a parameter. + static IN_OOM_RETRY: Cell = const { Cell::new(false) }; +} + use crate::bins::{self, BIN_COUNT, PAGES_DIRECT}; use crate::page::{ Block, DelayedList, Page, XFLAG_DELAYED, XFLAG_NORMAL, block_next, page_all_free, page_collect, @@ -393,6 +401,19 @@ impl Heap { return b; } } + self.zalloc_generic(size) + } + + /// `zalloc`'s miss, out of line and in TAIL position. + /// + /// Inline, this arm's call to `malloc_generic` had to return here to zero + /// the block, so `size` was live across it and every `calloc` — hit or + /// miss — paid a frame for it: `push`/`push` on entry and `add`/`pop`/ + /// `pop` before the fast path's `jmp memset` (callgrind, opscan `calloc`, + /// hit rate 94 %). Out here the fast path is a leaf. + #[cold] + #[inline(never)] + fn zalloc_generic(&mut self, size: usize) -> *mut u8 { // Slow/large path: rare, and the generic allocator has resolved the // page anyway. Recover the usable size the general way. let (b, is_zero) = self.malloc_generic(size); @@ -434,20 +455,84 @@ impl Heap { /// only ~649 generic trips in total, far under the 10,000 default, so the /// timer never fires. This trigger is failure, not a clock. /// - /// **Costs nothing on the happy path**: it runs only when the allocation - /// was about to fail. `collect_inner(true, true)` is `mi_collect(true)` — - /// reclaim orphans too, since this is the last resort before null. + /// `collect_inner(true, true)` is `mi_collect(true)` — reclaim orphans + /// too, since this is the last resort before null. + /// + /// **Where the retry test lives is a cost decision.** It first sat here as + /// `let r = once(size); if r.0.is_null() { collect; once(size) }`, which + /// read as free on the happy path and was not: a test AFTER the call means + /// the call is no longer in tail position, so `alloc::malloc_slow` — whose + /// own doc says "this arm must stay a TAIL call" — grew a frame, a spill of + /// `size` and a `test; je` again, 16 Ir around a 1-instruction jump on + /// every slow-path allocation (callgrind, opscan `big`). Now the test is in + /// `malloc_generic_once`'s epilogue, where the result is already in a + /// register, and this wrapper is a tail call. + /// + /// And "only once" is a THREAD-LOCAL, not a parameter. As a `retry: bool` + /// argument it cost every generic trip a `mov $1` at the call, a copy into + /// a callee-saved register, and a flag test ahead of the null test in the + /// epilogue — about four instructions to decide something only a null + /// result ever asks. Now the epilogue tests the result alone, and the flag + /// is read on the OOM path only. + /// + /// Inside the chain the zero flag is a `u8`, and it becomes a `bool` only + /// here. A `(*mut u8, bool)` pair return makes the caller re-truncate the + /// flag (`and $0x1,%dl`) after every call that returns one, which is what + /// kept `malloc_generic_once` from TAIL-calling `grow_front` — the + /// commonest generic outcome on a real program (jq: 10,307 of 11,229 + /// trips) — and the walk. Callers that want only the pointer, like + /// `alloc::malloc_slow`, drop the conversion entirely. + #[inline] pub(crate) fn malloc_generic(&mut self, size: usize) -> (*mut u8, bool) { - let r = self.malloc_generic_once(size); - if !r.0.is_null() { - return r; + let (p, z) = self.malloc_generic_once(size); + (p, z != 0) + } + + /// One pass of the generic path; on null, one reclaim-and-retry through + /// [`Heap::malloc_generic_retry`]. + /// + /// NOTE (2026-09-24, REFUTED on real programs): splitting the medium + /// collect-and-retry into a frameless entry that tail-calls the rest was + /// worth **-11.00 Ir/op** on opscan `big`/`large` and -6.83 on `mixed` — + /// the arm was paying this function's four-register frame. It cost every + /// OTHER generic trip ~8 Ir (an alignment `push` pinned by the collect + /// walk's diverging `double_free_abort`, a `pop`, a bool zero-extension + /// and a jump), and real programs make more of those than medium hits: + /// allocator Ir **lua +31,945, perl +23,549, sqlite +15,997**. Reverted. + /// Making the abort a may-return callee to drop the `push` was far worse + /// (see `page_collect_impl`). + /// + /// The OOM test is NOT here. In this epilogue it sat after every arm, + /// including the one that serves most real-program trips — jq: 10,307 of + /// 11,229 generic trips end in `grow_front` — which it turned from a tail + /// call into `call`, `jmp`, a copy and a `test; jne` (callgrind, per + /// instruction), for an arm that cannot fail. It lives at the three exits + /// that CAN return null: the fresh-page carve at the end of the walk, and + /// the large and huge arms. + #[inline(never)] + fn malloc_generic_once(&mut self, size: usize) -> (*mut u8, u8) { + self.malloc_generic_body(size) + } + + /// The reclaim-and-retry. The nested pass it makes lands back here on a + /// second null, and `IN_OOM_RETRY` is what turns that into the final + /// answer instead of another round. + #[cold] + #[inline(never)] + fn malloc_generic_retry(&mut self, size: usize) -> (*mut u8, u8) { + if IN_OOM_RETRY.with(Cell::get) { + return (ptr::null_mut(), 0); } + IN_OOM_RETRY.with(|c| c.set(true)); // SAFETY: owner thread; `collect_inner` allocates nothing. unsafe { self.collect_inner(true, true) }; - self.malloc_generic_once(size) + let r = self.malloc_generic_once(size); + IN_OOM_RETRY.with(|c| c.set(false)); + r } - fn malloc_generic_once(&mut self, size: usize) -> (*mut u8, bool) { + #[inline(always)] + fn malloc_generic_body(&mut self, size: usize) -> (*mut u8, u8) { self.stats.generic += 1; // Guarded objects (secure/guarded builds): sampled allocations get a // dedicated segment whose trailing page is PROT_NONE, so an overflow @@ -460,7 +545,7 @@ impl Heap { && self.guarded_rate != 0 && let Some(r) = self.try_guarded(size) { - return r; + return (r.0, u8::from(r.1)); } // COLLECT-AND-RETRY for the medium band, and it TURNS ITSELF OFF. // @@ -487,24 +572,74 @@ impl Heap { // allocations keeps the win however many threads the process has; a // producer whose pages a consumer frees pays one detection and then // behaves exactly as before. + // NOTE (2026-09-24, REFUTED): the arm usually MISSES on a real program + // (perl: 7,708 of 11,384 generic trips entered it, 7,695 found the + // front page dry after the collect), so those trips derive this bin + // twice — here and after the heartbeat. Computing it ONCE above both + // uses made it live across the heartbeat's calls: opscan `big`/`large` + // +17.00, `mixed` +11.86, perl allocator +101,962. Recomputing a pure + // value is cheaper than holding it in a callee-saved register. if !self.saw_remote_free && size > SMALL_SIZE_MAX && size <= MEDIUM_OBJ_SIZE_MAX { let bin = bins::bin(size); let p = self.pages[bin].first; if !p.is_null() { + // POP FIRST, as `malloc`'s own fast path does: when the front + // page's free list is non-empty the collect below changes + // nothing the pop needs — it would test the list, read the + // cross-thread word and re-load the list, eight instructions + // ahead of the pop on every medium hit (opscan `mixed`, + // callgrind per instruction). Remote frees still get + // collected, and the latch below still set, the first time + // the list runs dry. + // SAFETY: as for the collect-and-pop below. + let b = unsafe { page_pop(p) }; + if !b.is_null() { + self.stat_alloc(); + // SAFETY: p live per above. + return (b, u8::from(unsafe { (*p).free_is_zero })); + } // SAFETY: queue members are live pages of this heap, we are the // owner thread, and `page_collect` is the same operation the // walk below performs on this page. - let (stole, b) = unsafe { - let stole = crate::page::page_collect(p); - (stole, page_pop(p)) - }; - if stole { + // + // The latch is stored BEFORE the pop, inside the branch that + // knows it. Written as `(stole, pop)` and tested after, LLVM + // merged the two collect outcomes first and then materialised + // and re-tested a flag that is constant on the path that + // matters — `xor %eax,%eax` … `test %al,%al; je`, two dead + // instructions on every medium hit (opscan `big`/`large`). + if unsafe { crate::page::page_collect(p) } { self.saw_remote_free = true; } + // SAFETY: as above. + let b = unsafe { page_pop(p) }; if !b.is_null() { self.stat_alloc(); // SAFETY: p live per above. - return (b, unsafe { (*p).free_is_zero }); + return (b, u8::from(unsafe { (*p).free_is_zero })); + } + // The front page is dry but not fully carved: grow it HERE. + // Falling through, the trip ran the heartbeat, derived this + // same bin again, collected this same page again and only + // then reached `grow_front` — and on a real program that is + // the common medium outcome, not the hit (perl: 7,693 of + // 7,707 medium trips missed here; callgrind, per + // instruction). Skipping the heartbeat is what the hit above + // already does; it still runs when the page is exhausted and + // the walk is needed. + // SAFETY: `p` is the live front page of this bin's queue, + // its free list just came back empty, and it has room to + // carve — `grow_front`'s contract. + // + // `w` is passed as "above the direct table" rather than + // computed: `grow_front` reads it only for that test, a medium + // size is always above it, and computing `wsize_from_size` + // here made LLVM rewrite the bin arithmetic on the HIT path + // above (+5.00 Ir/op on opscan `big`/`large`). + unsafe { + if (*p).capacity < (*p).reserved { + return self.grow_front(bin, crate::types::SMALL_WSIZE_MAX + 1, p); + } } } } @@ -527,20 +662,30 @@ impl Heap { // // `reclaim = false`: this is a routine sweep of our own pages, not the // orphan adoption a forced `mi_collect(true)` performs. - if self.generic_countdown == 0 { + // + // One decrement whose wrap means "it was zero", rather than a test + // and then a decrement: the same schedule (N trips between sweeps, + // reset on the trip that finds zero), in a form that is a + // memory-destination `sub` and one branch on every generic trip + // instead of load, test, branch, decrement and store. + let left = self.generic_countdown.wrapping_sub(1); + self.generic_countdown = left; + if left == usize::MAX { self.generic_countdown = crate::options::get_clamp(crate::options::GENERIC_COLLECT, 1, 1_000_000) as usize; // SAFETY: owner thread, and `collect_inner` allocates nothing. unsafe { self.collect_inner(false, false) }; - } else { - self.generic_countdown -= 1; } if size > MEDIUM_OBJ_SIZE_MAX { - return if size <= LARGE_OBJ_SIZE_MAX { + let r = if size <= LARGE_OBJ_SIZE_MAX { self.large_alloc(size) } else { self.huge_alloc(size, 8, 0) }; + if r.0.is_null() { + return self.malloc_generic_retry(size); + } + return (r.0, u8::from(r.1)); } let bin = bins::bin(size); let w = wsize_from_size(size); @@ -568,7 +713,7 @@ impl Heap { } let b = page_pop(p); self.stat_alloc(); - return (b, (*p).free_is_zero); + return (b, u8::from((*p).free_is_zero)); } if (*p).capacity < (*p).reserved { return self.grow_front(bin, w, p); @@ -613,7 +758,7 @@ impl Heap { /// `capacity < reserved`. #[cold] #[inline(never)] - unsafe fn grow_front(&mut self, bin: usize, w: usize, p: *mut Page) -> (*mut u8, bool) { + unsafe fn grow_front(&mut self, bin: usize, w: usize, p: *mut Page) -> (*mut u8, u8) { // SAFETY: forwarded contract. unsafe { page_extend(p, (*p).area); @@ -626,7 +771,7 @@ impl Heap { } let b = page_pop(p); self.stat_alloc(); - (b, (*p).free_is_zero) + (b, u8::from((*p).free_is_zero)) } } @@ -646,7 +791,7 @@ impl Heap { /// # Safety /// `bin` indexes `self.pages`. #[inline(never)] - unsafe fn malloc_generic_walk(&mut self, bin: usize) -> (*mut u8, bool) { + unsafe fn malloc_generic_walk(&mut self, bin: usize) -> (*mut u8, u8) { // SAFETY: all page/queue manipulation below happens under the heap // lock on pages owned by this heap; raw pointers are used so no two // Rust references to the same Page coexist. @@ -692,7 +837,7 @@ impl Heap { self.update_direct(bin); let b = page_pop(p); self.stat_alloc(); - return (b, (*p).free_is_zero); + return (b, u8::from((*p).free_is_zero)); } // Truly full: park it so the queue front stays useful. let next = (*p).next; @@ -721,14 +866,18 @@ impl Heap { let p = self.fresh_page(bin, bsize); if p.is_null() { self.update_direct(bin); - return (ptr::null_mut(), false); // OOM + // OOM: the one reclaim-and-retry, with this bin's block size — + // the same class and the same block the caller would get. + // Here and not in `malloc_generic_once`'s epilogue: see + // `Heap::malloc_generic`. + return self.malloc_generic_retry(bsize); } page_extend(p, (*p).area); self.stats.extends += 1; self.update_direct(bin); let b = page_pop(p); self.stat_alloc(); - (b, (*p).free_is_zero) + (b, u8::from((*p).free_is_zero)) } } @@ -964,6 +1113,11 @@ impl Heap { } } + /// Out of line: `segment::huge_alloc` returns its `Result` through a stack + /// slot, and inlined here that slot became part of `malloc_generic_once`'s + /// frame — a `sub`/`add` of the stack pointer on EVERY generic trip for + /// an arm taken on requests above 32 MiB (callgrind, per instruction). + #[inline(never)] fn huge_alloc(&mut self, size: usize, align: usize, offset: usize) -> (*mut u8, bool) { match segment::huge_alloc(size, align, offset, self.arena_id) { Ok((seg, block)) => { @@ -1284,7 +1438,16 @@ impl Heap { // EXACTLY flat: LLVM already inlines `free_local` and proves // the block non-null from this loop's own condition.) self.free_local(b.cast()); - self.stats.delayed_frees += 1; + // Debug-only, like `allocs`/`frees` (`stat_alloc`) and + // upstream's `MI_STAT`: a read-modify-write per drained block + // on the cross-thread path, and nothing reads it but the stats + // printer — no test, bench or probe (unlike `generic` and + // `extends`, which the release bench prints as work-parity + // counters and so stay live). + #[cfg(debug_assertions)] + { + self.stats.delayed_frees += 1; + } b = next; } } @@ -1363,6 +1526,15 @@ impl Heap { // Running queue pointer: `self.pages[bin]` re-indexed the array // (and re-borrowed `self`) on every one of the MAX_NORMAL_BIN // steps, on every collect. + // + // REFUTED (2026-09-25): moving the per-queue body out of line so + // this scan would keep its pointer in a register (inlined, the + // body's calls spill it, and every EMPTY queue pays a reload and a + // store: nine instructions per bin). The thread-exit workload + // gained 272 instructions per thread, but the split changed + // inlining around the generic path's periodic collect and every + // opscan op got worse — `big`/`large` +4.00, `mixed` +2.89 — with + // perl +45,287 and python +79,035 whole-program. let qbase: *mut PageQueue = (&raw mut self.pages).cast::(); let mut q: *mut PageQueue = qbase.add(1); while bin <= MAX_NORMAL_BIN { diff --git a/crates/rusty_alloc/src/options.rs b/crates/rusty_alloc/src/options.rs index 7b38cc7..00cd5aa 100644 --- a/crates/rusty_alloc/src/options.rs +++ b/crates/rusty_alloc/src/options.rs @@ -322,7 +322,25 @@ const DEFAULTS: [i64; OPTION_COUNT] = [ static VALUES: [AtomicI64; OPTION_COUNT] = [const { AtomicI64::new(i64::MIN) }; OPTION_COUNT]; static ENV_PARSED: AtomicBool = AtomicBool::new(false); +/// Parse the environment once. The common case — every call after the first — +/// is one plain load and a branch, inlined into the caller. +/// +/// This used to be the `swap` below on EVERY call: a locked read-modify-write +/// behind an out-of-line call, on every `options::get`. `span_free` reads +/// `purge_delay` on every span it frees, so a 2 MiB alloc/free pair paid +/// **19 Ir in `ensure_init`** per operation (callgrind, opscan `huge`) to +/// learn that the environment had already been read. The swap stays, in the +/// cold arm, as what decides WHICH thread runs the pass. +#[inline(always)] fn ensure_init() { + if !ENV_PARSED.load(Ordering::Acquire) { + ensure_init_slow(); + } +} + +#[cold] +#[inline(never)] +fn ensure_init_slow() { if ENV_PARSED.swap(true, Ordering::AcqRel) { return; } @@ -335,13 +353,15 @@ fn ensure_init() { VALUES[i].store(DEFAULTS[i], Ordering::Release); } // ...and neither has `wasm32-unknown-unknown`. `std::env::var` there is a - // stub that always fails, so this loop formatted 76 strings, allocated 76 - // `String`s and read an environment that cannot exist — on every startup, - // to find nothing. It also dragged `core::fmt`, `alloc::fmt::format` and - // `str::to_uppercase` into a module that otherwise needs none of them: - // `options::get` was the LARGEST function in a wasm build at 3,708 bytes, - // ahead of anything in the allocator proper. Same deletion as the `no_std` - // arm above, for the same reason — there is nothing to read. + // stub that always fails, so the pass used to format 76 strings, allocate + // 76 `String`s and read an environment that cannot exist — on every + // startup, to find nothing. It also dragged `core::fmt`, + // `alloc::fmt::format` and `str::to_uppercase` into a module that + // otherwise needs none of them: `options::get` was the LARGEST function in + // a wasm build at 3,708 bytes, ahead of anything in the allocator proper. + // Same deletion as the `no_std` arm above, for the same reason — there is + // nothing to read. (The pass owns no memory any more, see `env`, but the + // wasm size ratchet is kept exactly where it was by leaving it out.) // // `target_os = "unknown"` and not `target_arch` alone: wasm32-wasip1 does // have an environment and keeps the pass. @@ -349,24 +369,286 @@ fn ensure_init() { feature = "std", not(all(target_arch = "wasm32", target_os = "unknown")) ))] - for i in 0..OPTION_COUNT { - let name = OPTION_NAMES[i].to_uppercase(); - let val = std::env::var(std::format!("RUSTY_ALLOC_{name}")) - .or_else(|_| std::env::var(std::format!("MIMALLOC_{name}"))) - .ok() - .and_then(|s| parse_value(&s)); - if let Some(v) = val { - VALUES[i].store(v, Ordering::Release); + env::pass(); +} + +/// The environment pass, and why it owns no memory. +/// +/// It used to be `OPTION_NAMES[i].to_uppercase()` and two `format!`ed keys +/// handed to `std::env::var`, every one of which returns an owned `String`: +/// 38 options x (one uppercase name, two keys, up to two values) made **251 +/// allocations through the global allocator on the first allocation of every +/// process**, measured from a consumer behind a counting `GlobalAlloc` +/// (`docs/plans/youslowbro.md` §4), where mimalloc makes none. Each one landed +/// in the heap that was still being set up — allocator re-entrancy during +/// initialisation — and every short CLI run paid all of them. +/// +/// Now the key is built by hand in a stack buffer sized by the table, the +/// value lands in a second stack buffer through `prim::getenv` — the raw +/// `getenv` / `GetEnvironmentVariableA` that upstream's prim calls — and the +/// parse reads the bytes in place. Zero allocations, and +/// `crates/rusty_alloc_api/tests/reentrancy.rs` fails if one comes back. +#[cfg(all( + feature = "std", + not(all(target_arch = "wasm32", target_os = "unknown")) +))] +mod env { + use core::sync::atomic::Ordering; + + use super::{OPTION_COUNT, OPTION_NAMES, VALUES}; + + /// Longest option name: the key buffer is sized by the table, not by hand. + const MAX_NAME_LEN: usize = { + let mut m = 0; + let mut i = 0; + while i < OPTION_COUNT { + if OPTION_NAMES[i].len() > m { + m = OPTION_NAMES[i].len(); + } + i += 1; + } + m + }; + /// `RUSTY_ALLOC_` is the longer prefix; `+ 1` for the NUL a C `getenv` needs. + const KEY_CAP: usize = "RUSTY_ALLOC_".len() + MAX_NAME_LEN + 1; + /// Values are integers and booleans; upstream's buffer is 64 bytes as well. + const VALUE_CAP: usize = 64; + + /// `RUSTY_ALLOC_` first, `MIMALLOC_` second, as before. + pub(super) fn pass() { + #[cfg(all(target_os = "linux", not(miri)))] + { + scan_pass(); + } + #[cfg(not(all(target_os = "linux", not(miri))))] + { + keyed_pass(); } } -} -#[cfg(feature = "std")] -fn parse_value(s: &str) -> Option { - match s.trim().to_ascii_lowercase().as_str() { - "" | "1" | "true" | "yes" | "on" => Some(1), - "0" | "false" | "no" | "off" => Some(0), - t => t.parse::().ok(), + /// The same pass as ONE walk of the environment (`prim::env_for_each`) + /// instead of 76 `getenv` calls, each of which walks all of it: 27,011 + /// instructions on the first allocation of every process, 2 % of a + /// one-line `sort` (callgrind, inclusive). Keeps [`keyed_pass`]'s + /// semantics exactly: the FIRST occurrence of a key is the one `getenv` + /// returns, a value too long for `VALUE_CAP` reads as unset (so it falls + /// back to `MIMALLOC_`), and a present-but-unparsable `RUSTY_ALLOC_` value + /// keeps the default without consulting `MIMALLOC_`. + #[cfg(all(target_os = "linux", not(miri)))] + fn scan_pass() { + let mut rusty = [core::ptr::null::(); OPTION_COUNT]; + let mut mi = [core::ptr::null::(); OPTION_COUNT]; + crate::prim::env_for_each(|e| { + // SAFETY: `e` is a NUL-terminated environment entry; `strip` + // and `match_name` stop at the first mismatch, so no read passes + // its NUL. + unsafe { + let (table, rest) = if let Some(r) = strip(e, b"RUSTY_ALLOC_") { + (&mut rusty, r) + } else if let Some(r) = strip(e, b"MIMALLOC_") { + (&mut mi, r) + } else { + return; + }; + for i in 0..OPTION_COUNT { + if let Some(v) = match_name(rest, OPTION_NAMES[i].as_bytes()) { + if table[i].is_null() { + table[i] = v; + } + break; + } + } + } + }); + let mut val = [0u8; VALUE_CAP]; + for i in 0..OPTION_COUNT { + // SAFETY: each non-null entry points at a NUL-terminated value. + let got = + unsafe { copy_value(rusty[i], &mut val).or_else(|| copy_value(mi[i], &mut val)) }; + if let Some(v) = got.and_then(|len| parse_value(&val[..len])) { + VALUES[i].store(v, Ordering::Release); + } + } + } + + /// `e` past `prefix`, if it starts with it. + /// + /// # Safety + /// `e` NUL-terminated. + #[cfg(all(target_os = "linux", not(miri)))] + unsafe fn strip(e: *const u8, prefix: &[u8]) -> Option<*const u8> { + for (k, &b) in prefix.iter().enumerate() { + // SAFETY: a mismatch (the NUL included) returns before reading on. + if unsafe { *e.add(k) } != b { + return None; + } + } + // SAFETY: every byte up to here matched a non-NUL prefix byte. + Some(unsafe { e.add(prefix.len()) }) + } + + /// The value after `NAME=` when `rest` is exactly the uppercased `name` + /// followed by `=` — `getenv`'s case-sensitive match. + /// + /// # Safety + /// `rest` NUL-terminated. + #[cfg(all(target_os = "linux", not(miri)))] + unsafe fn match_name(rest: *const u8, name: &[u8]) -> Option<*const u8> { + for (k, &b) in name.iter().enumerate() { + // SAFETY: as in `strip`. + if unsafe { *rest.add(k) } != b.to_ascii_uppercase() { + return None; + } + } + // SAFETY: as in `strip`. + unsafe { (*rest.add(name.len()) == b'=').then(|| rest.add(name.len() + 1)) } + } + + /// `prim::getenv`'s copy: the value into `out`, `None` when `v` is null or + /// the value does not fit. + /// + /// # Safety + /// `v` null or NUL-terminated. + #[cfg(all(target_os = "linux", not(miri)))] + unsafe fn copy_value(v: *const u8, out: &mut [u8]) -> Option { + if v.is_null() { + return None; + } + for (n, slot) in out.iter_mut().enumerate() { + // SAFETY: stops at the value's NUL. + let b = unsafe { *v.add(n) }; + if b == 0 { + return Some(n); + } + *slot = b; + } + None // longer than the buffer: not an option value + } + + /// One `getenv` per key: every host without `prim::env_for_each`. + #[cfg_attr(all(target_os = "linux", not(miri)), allow(dead_code))] + fn keyed_pass() { + let mut key = [0u8; KEY_CAP]; + let mut val = [0u8; VALUE_CAP]; + for i in 0..OPTION_COUNT { + let name = OPTION_NAMES[i].as_bytes(); + let n = build_key(&mut key, b"RUSTY_ALLOC_", name); + let got = lookup(&key[..n], &mut val).or_else(|| { + let n = build_key(&mut key, b"MIMALLOC_", name); + lookup(&key[..n], &mut val) + }); + if let Some(v) = got.and_then(|len| parse_value(&val[..len])) { + VALUES[i].store(v, Ordering::Release); + } + } + } + + /// `\0`, `name` ASCII-uppercased, into `key`; returns the + /// length written, NUL included. `KEY_CAP` bounds every combination. + fn build_key(key: &mut [u8; KEY_CAP], prefix: &[u8], name: &[u8]) -> usize { + let mut n = 0; + for &b in prefix { + key[n] = b; + n += 1; + } + for &b in name { + key[n] = b.to_ascii_uppercase(); + n += 1; + } + key[n] = 0; + n + 1 + } + + /// One variable, no allocation: `prim::getenv` on a hosted OS. + #[cfg(all(any(windows, unix), not(miri)))] + fn lookup(key: &[u8], out: &mut [u8]) -> Option { + crate::prim::getenv(key, out) + } + + /// The same through `std::env` where there is no raw `getenv` to call: + /// Miri, which interprets `std::env` itself, and wasm32-wasip1. This arm + /// allocates, and that is accepted — neither is a shipping host. + #[cfg(not(all(any(windows, unix), not(miri))))] + fn lookup(key: &[u8], out: &mut [u8]) -> Option { + let name = core::str::from_utf8(key.split_last()?.1).ok()?; + let v = std::env::var_os(name)?; + let v = v.to_str()?.as_bytes(); + if v.len() >= out.len() { + return None; + } + out[..v.len()].copy_from_slice(v); + Some(v.len()) + } + + /// mimalloc's value grammar, on the bytes in place: 1/0/true/false/yes/ + /// no/on/off in any case (an empty value is 1), else a decimal integer. + fn parse_value(v: &[u8]) -> Option { + let t = core::str::from_utf8(v).ok()?.trim(); + if ["", "1", "true", "yes", "on"] + .iter() + .any(|w| t.eq_ignore_ascii_case(w)) + { + return Some(1); + } + if ["0", "false", "no", "off"] + .iter() + .any(|w| t.eq_ignore_ascii_case(w)) + { + return Some(0); + } + t.parse::().ok() + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn keys_are_the_uppercased_names_with_a_nul_and_always_fit() { + let mut key = [0u8; KEY_CAP]; + let n = build_key(&mut key, b"RUSTY_ALLOC_", b"purge_delay"); + assert_eq!(&key[..n], b"RUSTY_ALLOC_PURGE_DELAY\0"); + let n = build_key(&mut key, b"MIMALLOC_", b"show_stats"); + assert_eq!(&key[..n], b"MIMALLOC_SHOW_STATS\0"); + // The longest name with the longer prefix is exactly what the + // buffer was sized for; `build_key` would panic past it. + for name in OPTION_NAMES { + let n = build_key(&mut key, b"RUSTY_ALLOC_", name.as_bytes()); + assert!(n <= KEY_CAP, "{name}"); + assert_eq!(key[n - 1], 0); + } + } + + #[test] + fn values_follow_mimalloc_grammar() { + assert_eq!(parse_value(b""), Some(1)); + assert_eq!(parse_value(b" On "), Some(1)); + assert_eq!(parse_value(b"TRUE"), Some(1)); + assert_eq!(parse_value(b"off"), Some(0)); + assert_eq!(parse_value(b"No"), Some(0)); + assert_eq!(parse_value(b" -1 "), Some(-1)); + assert_eq!(parse_value(b"1048576"), Some(1_048_576)); + assert_eq!(parse_value(b"maybe"), None); + assert_eq!(parse_value(&[0xff, 0xfe]), None); + } + + #[test] + fn lookup_reads_the_process_environment_in_place() { + // SAFETY: this test is the only writer of these names, and the + // one reader of the environment in this process — the one-shot + // option pass — ran when the harness made its first allocation. + unsafe { + std::env::set_var("RUSTY_ALLOC_TEST_PROBE", " 42 "); + std::env::set_var("RUSTY_ALLOC_TEST_LONG_PROBE", "x".repeat(VALUE_CAP)); + } + let mut out = [0u8; VALUE_CAP]; + let n = lookup(b"RUSTY_ALLOC_TEST_PROBE\0", &mut out).expect("set"); + assert_eq!(&out[..n], b" 42 "); + assert_eq!(parse_value(&out[..n]), Some(42)); + assert_eq!(lookup(b"RUSTY_ALLOC_TEST_PROBE_UNSET\0", &mut out), None); + // A value that does not fit is not an option value. + assert_eq!(lookup(b"RUSTY_ALLOC_TEST_LONG_PROBE\0", &mut out), None); + } } } @@ -385,6 +667,13 @@ pub fn get(option: usize) -> i64 { if crate::ONE_REGION { return DEFAULTS[option]; } + // NOTE (2026-09-24, REFUTED): a "table complete" flag, so the steady + // state could skip the `i64::MIN` sentinel test below, measured flat on + // every opscan op and slightly worse on real programs (allocator Ir lua + // +527, perl +255, sqlite +162). The sentinel is already free where it is + // hot: the callers test the value's SIGN, `i64::MIN` is negative, and + // LLVM folds both questions into one `js` (see `span_free`'s + // `purge_delay` read). ensure_init(); let v = VALUES[option].load(Ordering::Acquire); if v == i64::MIN { DEFAULTS[option] } else { v } @@ -633,12 +922,6 @@ pub fn deferred_free(force: bool) { if DEFERRED_FUN.load_fun().is_null() { return; } - // A hook that allocates re-enters `malloc_generic` → `deferred_free`. - // Without a per-thread guard that recurses until the stack dies - // (OH-rusty_alloc-17). - if IN_DEFERRED.with(|c| c.get()) { - return; - } fire_deferred(force); } @@ -649,9 +932,25 @@ pub fn deferred_free(force: bool) { /// forces the whole heartbeat's caller to preserve callee-saved registers, on /// every slow-path allocation, for a hook that is unregistered in nearly every /// process. The peek above is all the common path executes. +/// +/// The re-entry guard lives HERE, not in `deferred_free`, and that is the +/// point of it. In a cdylib `IN_DEFERRED` is a general-dynamic thread-local, +/// so reading it is a call to `__tls_get_addr` — and LLVM treats that address +/// computation as free to hoist, so with the guard inline it ran ABOVE the +/// null test of the hook pointer: **12 Ir in `__tls_get_addr` on every +/// slow-path allocation**, for a hook no process had registered (callgrind, +/// opscan `huge`/`big`; the disassembly loads `DEFERRED_FUN` and calls +/// `__tls_get_addr` before testing it). Out here it runs only when a hook +/// exists. #[cold] #[inline(never)] fn fire_deferred(force: bool) { + // A hook that allocates re-enters `malloc_generic` → `deferred_free`. + // Without a per-thread guard that recurses until the stack dies + // (OH-rusty_alloc-17). + if IN_DEFERRED.with(|c| c.get()) { + return; + } IN_DEFERRED.with(|c| c.set(true)); let _clear = HookExit(|| IN_DEFERRED.with(|c| c.set(false))); let (f, a) = DEFERRED_FUN.load(); diff --git a/crates/rusty_alloc/src/page.rs b/crates/rusty_alloc/src/page.rs index e6c5cdd..4ffa09d 100644 --- a/crates/rusty_alloc/src/page.rs +++ b/crates/rusty_alloc/src/page.rs @@ -831,15 +831,37 @@ pub unsafe fn remote_free(page: *mut Page, block: *mut Block) { break; } } - // Restore DELAYED, preserving whatever the owner did - // to the pointer bits meanwhile. + // Release FREEING, preserving whatever the owner did + // to the pointer bits meanwhile — to NORMAL, as + // upstream does (`mi_tf_set_delayed(.., MI_NO_DELAYED_FREE)` + // in `_mi_free_block_mt`), not back to DELAYED. + // + // One block on the owner's delayed list is all the + // owner needs: draining it un-parks the page + // (`free_local_at`), and from then on the page is + // scanned. Restoring DELAYED sent EVERY later remote + // free to a parked page through this three-CAS route + // and the owner through `drain_delayed` + + // `free_local_at` per block — 82 % of the frees on the + // `xthread` op. After NORMAL they are one CAS onto the + // page's own list, collected in bulk. + // + // SINGLE-BLOCK pages (large spans, huge segments) keep + // DELAYED: they are never scanned, so their only route + // to the owner is this list. + let restore = + if (*page).flags.load(Ordering::Relaxed) & pflags::SINGLE_BLOCK != 0 { + XFLAG_DELAYED + } else { + XFLAG_NORMAL + }; loop { let y = (*page).xthread_free.load(Ordering::Acquire); if (*page) .xthread_free .compare_exchange_weak( y, - (y & !XMASK) | XFLAG_DELAYED, + (y & !XMASK) | restore, Ordering::AcqRel, Ordering::Relaxed, ) @@ -1056,6 +1078,14 @@ unsafe fn page_collect_impl(page: *mut Page, flag: usize) let mut tail = head; let mut n = 1u32; loop { + // NOTE (2026-09-24, REFUTED): calling the may-return + // `remote_double_free` here instead — to stop this diverging + // call pinning an alignment `push` to the top of + // `malloc_generic_once`'s frameless medium arm — made it far + // WORSE: a call that may return, inside the walk loop, keeps + // `tail`/`n`/`page` live across it, and the entry grew a + // six-register frame (opscan `huge` +20.00, every op worse). + // The may-return trick works only in TAIL position. if n > used { double_free_abort(); } @@ -1091,6 +1121,17 @@ const EXTEND_SHIFT_BASE: u32 = { crate::types::SEGMENT_SLICE_SIZE.trailing_zeros() - 12 }; +/// The fewest blocks one [`page_extend`] links, whatever the block size — +/// upstream's `MI_MIN_EXTEND` (4 outside its secure mode). +/// +/// Ours was an implicit 1 (`.max(1)`), a drift from upstream: every class +/// whose 4 KiB byte bound rounds below four blocks — everything above 1 KiB — +/// was carved one to three blocks per extend, so on perl 8,990 of 10,639 +/// extends linked one block and each was a full generic trip (callgrind, per +/// instruction). The floor only moves list-linking earlier inside a span +/// that is already committed; it touches at most four block headers. +const MIN_EXTEND: usize = 4; + /// Lazily extend the free list into never-used capacity (`mi_page_extend_free`). /// /// # Safety @@ -1210,7 +1251,11 @@ pub unsafe fn page_extend(page: *mut Page, area: *mut u8) { // Derived, so it is correct at every geometry and byte-identical at the // default (65536 >> 12 == 16, whose log2 is the old 4). let span_shift = EXTEND_SHIFT_BASE + (*page).slice_count.trailing_zeros(); - let take = ((reserved >> span_shift).max(1)).min(reserved - capacity); + // At least `MIN_EXTEND` blocks, as upstream (`MI_MIN_EXTEND`, 4): the + // byte bound alone gives ONE block to any class above 4 KiB and one + // to three to classes above 1 KiB, so a fresh medium page served one + // allocation per slow-path trip. See `MIN_EXTEND`. + let take = ((reserved >> span_shift).max(MIN_EXTEND)).min(reserved - capacity); let start = area.add(capacity * bsize); // Link the fresh blocks in address order. // diff --git a/crates/rusty_alloc/src/prim/fixed.rs b/crates/rusty_alloc/src/prim/fixed.rs index 29deaec..3451e58 100644 --- a/crates/rusty_alloc/src/prim/fixed.rs +++ b/crates/rusty_alloc/src/prim/fixed.rs @@ -2085,6 +2085,10 @@ mod tests { assert!(!shape_of(SMALL_SIZE_MAX + 1).direct_route); // The route top is 1024 on 64-bit and 512 on 32-bit, whatever the // geometry -- it is a pointer-width fact, not a profile one. + // At the DEFAULT `SMALL_WSIZE_MAX`. The relationship asserted above + // holds at every setting of `ra_small_wsize`; these literals are the + // default arm's, and are pinned as such rather than unconditionally. + #[cfg(not(any(ra_small_wsize = "256", ra_small_wsize = "512")))] if core::mem::size_of::() == 8 { assert_eq!(SMALL_SIZE_MAX, 1024); } else if core::mem::size_of::() == 4 { diff --git a/crates/rusty_alloc/src/prim/mod.rs b/crates/rusty_alloc/src/prim/mod.rs index 8945d42..ecfe55c 100644 --- a/crates/rusty_alloc/src/prim/mod.rs +++ b/crates/rusty_alloc/src/prim/mod.rs @@ -202,6 +202,43 @@ pub fn numa_node_count() -> usize { sys::numa_node_count().max(1) } +/// Copy the value of the environment variable `name` — NUL-terminated ASCII — +/// into `out`, **without allocating** (`_mi_prim_getenv`). `Some(len)` with the +/// value's byte length when the variable is set and fits; `None` when it is +/// unset, empty on Windows (the API reports both as 0 and upstream's prim +/// treats both as unset), or longer than `out`. +/// +/// This exists because `options.rs` read the environment through +/// `std::env::var`, whose key and value are both owned `String`s: 38 options +/// x 2 prefixes made **251 allocations through the global allocator on the +/// first allocation of every process** — inside the heap that was being set +/// up (`docs/plans/youslowbro.md` §4). Hosted platforms only: a firmware has +/// no environment, wasm has no raw `getenv`, and Miri interprets `std::env` +/// itself, so `options.rs` keeps a `std::env` fallback for those. +#[cfg(all(any(windows, unix), not(miri)))] +pub fn getenv(name: &[u8], out: &mut [u8]) -> Option { + debug_assert_eq!(name.last(), Some(&0), "getenv: name must be NUL-terminated"); + if name.last() != Some(&0) || out.is_empty() { + return None; + } + sys::getenv(name, out) +} + +/// Call `f` with a pointer to every `NAME=VALUE` entry of the process +/// environment, in order, each NUL-terminated — one walk of `environ`, without +/// allocating. Linux only (glibc and musl export `environ`; a macOS dylib has +/// to go through `_NSGetEnviron`, and Windows has no such block of C strings). +/// +/// For `options.rs`, which needs 38 options under two prefixes: as 76 +/// [`getenv`] calls that is 76 walks of the whole environment, 17,372 +/// instructions inside libc and 27,011 inclusive on the first allocation of +/// every process — 2 % of a one-line `sort` (callgrind). One walk that looks +/// only at entries starting with either prefix does the same job. +#[cfg(all(target_os = "linux", not(miri)))] +pub fn env_for_each(f: impl FnMut(*const u8)) { + sys::env_for_each(f); +} + /// Cheap unique id of the calling thread (the heap-ownership key from M4). #[inline] pub fn thread_id() -> usize { diff --git a/crates/rusty_alloc/src/prim/unix.rs b/crates/rusty_alloc/src/prim/unix.rs index 5a64278..d7540e7 100644 --- a/crates/rusty_alloc/src/prim/unix.rs +++ b/crates/rusty_alloc/src/prim/unix.rs @@ -230,6 +230,54 @@ pub(super) fn numa_node_count() -> usize { 1 // sysfs/getcpu wiring lands with arenas (M6) } +/// `_mi_prim_getenv`: the value of `name` into `out`, no allocation of ours. +pub(super) fn getenv(name: &[u8], out: &mut [u8]) -> Option { + // SAFETY: `name` is NUL-terminated (checked by `prim::getenv`). `getenv` + // returns null or a pointer into the process environment block, which + // lives for the process and is read here once, byte by byte, stopping at + // its NUL or at `out.len()`; nothing is written through it. This is not + // safe against a concurrent `setenv`, which is the standing caveat on + // `std::env::set_var` as well, and the same call upstream's prim makes. + unsafe { + let v: *const u8 = libc::getenv(name.as_ptr().cast()).cast(); + if v.is_null() { + return None; + } + let mut n = 0; + while n < out.len() { + let b = *v.add(n); + if b == 0 { + return Some(n); + } + out[n] = b; + n += 1; + } + } + None // longer than the buffer: not an option value +} + +/// Every entry of `environ`, in order; see `prim::env_for_each`. +#[cfg(target_os = "linux")] +pub(super) fn env_for_each(mut f: impl FnMut(*const u8)) { + unsafe extern "C" { + static environ: *const *const u8; + } + // SAFETY: `environ` is the C runtime's NULL-terminated array of + // NUL-terminated `NAME=VALUE` strings, live for the process. It is only + // read here, and each entry is handed on as a pointer, not copied. As with + // `getenv` above, this is not safe against a concurrent `setenv`. + unsafe { + let mut p = environ; + if p.is_null() { + return; + } + while !(*p).is_null() { + f(*p); + p = p.add(1); + } + } +} + #[inline] pub(super) fn thread_id() -> usize { // SAFETY: no preconditions; pthread_self is async-signal-safe. diff --git a/crates/rusty_alloc/src/prim/windows.rs b/crates/rusty_alloc/src/prim/windows.rs index 8a80683..dd4524a 100644 --- a/crates/rusty_alloc/src/prim/windows.rs +++ b/crates/rusty_alloc/src/prim/windows.rs @@ -13,6 +13,7 @@ use core::ptr; use core::sync::atomic::{AtomicU64, Ordering}; use windows_sys::Win32::Foundation::GetLastError; +use windows_sys::Win32::System::Environment::GetEnvironmentVariableA; use windows_sys::Win32::System::Memory::{ GetLargePageMinimum, MEM_COMMIT, MEM_DECOMMIT, MEM_FREE, MEM_LARGE_PAGES, MEM_RELEASE, MEM_RESERVE, MEM_RESET, MEMORY_BASIC_INFORMATION, PAGE_NOACCESS, PAGE_READWRITE, VirtualAlloc, @@ -234,6 +235,28 @@ pub(super) fn numa_node_count() -> usize { if ok != 0 { highest as usize + 1 } else { 1 } } +/// `_mi_prim_getenv`: the value of `name` into `out`, no allocation of ours. +/// +/// The ANSI form, as upstream's prim uses: option values are integers and +/// booleans, so there is nothing to lose to the code page. The API converts +/// the name to UTF-16 on the process heap — never through this allocator. +pub(super) fn getenv(name: &[u8], out: &mut [u8]) -> Option { + let cap = u32::try_from(out.len()).ok()?; + // SAFETY: `name` is NUL-terminated (checked by `prim::getenv`); `out` is + // a live buffer of exactly `cap` bytes, and the call writes at most `cap` + // bytes into it — when the value does not fit it writes nothing and + // returns the size it would need. + let n = unsafe { GetEnvironmentVariableA(name.as_ptr(), out.as_mut_ptr(), cap) }; + // 0 is "unset" or "empty", which the API cannot distinguish without a + // `GetLastError` round-trip; upstream's prim treats both as unset, and so + // does this. `n >= cap` means it did not fit: not an option value. + if n == 0 || n >= cap { + None + } else { + Some(n as usize) + } +} + #[inline] pub(super) fn thread_id() -> usize { // SAFETY: no preconditions. diff --git a/crates/rusty_alloc/src/segment.rs b/crates/rusty_alloc/src/segment.rs index e13518d..c5cbd5c 100644 --- a/crates/rusty_alloc/src/segment.rs +++ b/crates/rusty_alloc/src/segment.rs @@ -455,9 +455,22 @@ pub unsafe fn segment_free(seg: *mut Segment) -> Result<(), PrimError> { /// Write the span markers for a span at `idx` of `len` slices: first slot /// offset 0, interior+last offsets pointing back. /// +/// Interior slices below `from` are NOT rewritten: the caller knows they +/// already point back to `idx` in both representations. That holds for every +/// slice of every span in a normal segment (this is their only writer, and +/// `debug_validate_segment` checks it), so a span taken from the FRONT of a +/// free span, or a freed span that did not merge into its left neighbour, +/// starts where its interiors already point. Rewriting them was the largest +/// loop in both `span_alloc` and `span_free`, and it stored values that were +/// already there: 31 of 31 interior slices, twice, per 2 MiB allocate-and-free +/// (opscan `huge`, callgrind per instruction). `from == 1` marks everything. +/// /// # Safety -/// `[idx, idx+len)` must lie in the carved region of `seg` under the heap lock. -unsafe fn span_mark(seg: *mut Segment, idx: usize, len: usize) { +/// `[idx, idx+len)` must lie in the carved region of `seg` under the heap lock; +/// `from >= 1`, and slices `idx+1 .. idx+min(from, len)` must already point +/// back to `idx`. +unsafe fn span_mark(seg: *mut Segment, idx: usize, len: usize, from: usize) { + debug_assert!(from >= 1, "span_mark: slot 0 is the head, not an interior"); // SAFETY: caller contract keeps every index in bounds. unsafe { (*seg).pages[idx].slice_offset = 0; @@ -478,10 +491,17 @@ unsafe fn span_mark(seg: *mut Segment, idx: usize, len: usize) { let owner = page_off_for(idx); let tab: *mut u32 = (&raw mut (*seg).page_off).cast(); *tab.wrapping_add(idx) = owner; + // NOTE (2026-09-24, REFUTED): splitting the owner-table stores into + // their own `slice::fill` pass, away from the stride-88 `slice_offset` + // stores, made both loops cheaper (151 -> 92 + 43 instructions for a + // 32-slice span) and the function DEARER: each loop brings its own + // unroll setup and scalar remainder. Opscan `huge` +28.00, perl +340, + // lua -8,327, sqlite -862 allocator Ir — a sign flip by span length, + // not a win. Same verdict as the fill `huge_alloc` measured flat. let base: *mut Page = (&raw mut (*seg).pages).cast(); - let mut slot = base.wrapping_add(idx + 1); - let mut ent = tab.wrapping_add(idx + 1); - let mut j = 1; + let mut slot = base.wrapping_add(idx + from); + let mut ent = tab.wrapping_add(idx + from); + let mut j = from; while j < len { // SLICES back to the span start, not bytes — see Page::slice_offset. (*slot).slice_offset = j as u16; @@ -516,10 +536,10 @@ unsafe fn span_mark(seg: *mut Segment, idx: usize, len: usize) { /// /// # Safety /// As [`span_mark`]; the span must not be in the free list already. -unsafe fn span_mark_free(seg: *mut Segment, idx: usize, len: usize) { +unsafe fn span_mark_free(seg: *mut Segment, idx: usize, len: usize, from: usize) { // SAFETY: caller contract. unsafe { - span_mark(seg, idx, len); + span_mark(seg, idx, len, from); let slot: *mut Page = &raw mut (*seg).pages[idx]; (*slot).block_size = 0; // free marker (*slot).prev = ptr::null_mut(); @@ -642,9 +662,11 @@ pub unsafe fn span_alloc(seg: *mut Segment, slices: usize) -> (*mut Page, bool) // remainder inherits the (now cleared) purged state. span_recommit(seg, idx, len); if len > slices { - span_mark_free(seg, idx + slices, len - slices); + // The remainder starts at a new slice: re-mark all of it. + span_mark_free(seg, idx + slices, len - slices, 1); } - span_mark(seg, idx, slices); + // The FRONT of a free span: its interiors already point here. + span_mark(seg, idx, slices, slices); (*seg).used_pages += 1; return (s, false); } @@ -659,7 +681,8 @@ pub unsafe fn span_alloc(seg: *mut Segment, slices: usize) -> (*mut Page, bool) (*seg).next_free_slice = (idx + slices) as u32; (*seg).used_pages += 1; let start: *mut Page = &raw mut (*seg).pages[idx]; - span_mark(seg, idx, slices); + // Never-carved slices: mark all of them. + span_mark(seg, idx, slices, 1); (start, (*seg).mem_is_zero) } } @@ -683,6 +706,9 @@ pub unsafe fn span_free(seg: *mut Segment, page: *mut Page) -> bool { unsafe { let mut idx = page_index(seg, page); let mut len = (*page).slice_count as usize; + // Where the freed span sat before any merge: its interiors already + // point back to `freed_idx` (see `span_mark`). + let (freed_idx, freed_len) = (idx, len); (*seg).used_pages -= 1; // Scrub page state so a stale slot can't masquerade as live. (*page).block_size = 0; @@ -718,15 +744,26 @@ pub unsafe fn span_free(seg: *mut Segment, page: *mut Page) -> bool { idx = lstart_idx; } } - span_mark_free(seg, idx, len); + // Re-mark only what does not already point to `idx`: with no left + // merge the freed span itself starts here and only an absorbed right + // neighbour moves; after a left merge the left span is already right + // and everything from the freed span on moves. + let from = if idx == freed_idx { + freed_len + } else { + freed_idx - idx + }; + span_mark_free(seg, idx, len, from); // PURGE the coalesced free span (the RSS lever): return its pages to // the OS. Only worthwhile for multi-slice spans — a syscall costs // more than the pages a single 64 KiB slice returns. The span is // marked `purged` so reuse re-commits it; skipping that recommit is // an access violation on Windows (MEM_DECOMMIT), which is how this // was caught (2026-08-05). - let purge_delay = crate::options::get(15); - if purge_delay >= 0 && len >= crate::types::MEDIUM_PAGE_SLICES { + // Length FIRST: it is in a register, the option is a table load, a + // bounds test and a sentinel test — and most freed spans are short, so + // most frees never need the option at all. + if len >= crate::types::MEDIUM_PAGE_SLICES && crate::options::get(15) >= 0 { let area = page_area(seg, idx); let bytes = len * SEGMENT_SLICE_SIZE; let decommits = crate::options::is_enabled(5); // purge_decommits @@ -917,7 +954,22 @@ pub fn huge_alloc( // offsets back to it (only slices 1..512 are addressable via the mask // trick, and aligned offsets stay < SEGMENT_SIZE/2 by the contract). let page: *mut Page = &raw mut (*seg).pages[1]; - (*page).block_size = b.size - (block.addr() - seg.addr()); + // The block's usable size is what was ASKED for, rounded up to a + // slice — upstream's `psize` (`mi_segment_huge_page_alloc`, oracle + // segment.c:1599) — and NOT the reservation. The reservation is + // chunk-rounded (`chunks * SEGMENT_SIZE` through an arena), so a 33 MB + // request holds a 64 MiB chunk pair and a 64 MB one holds 96 MiB. + // This field used to report that whole extent, and `usable_size` is + // the copy length of every `realloc` that MOVES: growing a 33 MB block + // copied — and first-touched, on both sides — 64 MiB, and a 64 MB + // block 96 MiB. Measured from a consumer at **1.41x / 1.23x mimalloc, + // 0/6 pairs** for exactly those two steps, at parity for every step + // below the segment size (`docs/plans/youslowbro.md` §3). `zalloc` on + // a recycled chunk zeroes `usable_size` bytes and paid the same tax. + // The capacity is still `total_size`, and nothing reads past + // `block_size`; `usable_size` now agrees with `mi_usable_size` here. + let capacity = b.size - (block.addr() - seg.addr()); + (*page).block_size = crate::prim::align_up(size.max(1), SEGMENT_SLICE_SIZE).min(capacity); (*page).used = 1; (*page).capacity = 1; (*page).reserved = 1; diff --git a/crates/rusty_alloc/src/types.rs b/crates/rusty_alloc/src/types.rs index 30d42aa..345f645 100644 --- a/crates/rusty_alloc/src/types.rs +++ b/crates/rusty_alloc/src/types.rs @@ -11,7 +11,33 @@ pub const INTPTR_SIZE: usize = core::mem::size_of::(); /// Maximum "small" allocation in machine words (`MI_SMALL_WSIZE_MAX` = 128). /// /// Source: `mimalloc.h` v2.4.5 — `#define MI_SMALL_WSIZE_MAX (128)`. -pub const SMALL_WSIZE_MAX: usize = 128; +/// +/// `--cfg ra_small_wsize="256"` / `"512"` raises it, and the default is +/// unchanged. The cfg exists for the same reason [`GENERIC_COLLECT_DEFAULT`] +/// grew one: a bare-metal consumer could measure that this bound was costing +/// it and had no way to move it. +/// +/// **Why a 32-bit target wants it.** [`SMALL_SIZE_MAX`] is this times +/// `INTPTR_SIZE`, so the `direct[]` fast path covers 1 KiB on a 64-bit host +/// and only **512 bytes on a 32-bit chip** — the same pointer-width trap that +/// made the `direct`-route step invisible on a host sweep. Measured on an +/// ESP32-S3 (`rusty_rtos_core/firmware/esp32s3-devkit-alloc-ab`), an +/// alloc/free pair costs **114 cycles at 512 bytes and 249 at 513**: one byte +/// over the bound is +135 cycles, because the request falls off the end of +/// the table and takes the generic path. +/// +/// The price is the table: `direct` is `SMALL_WSIZE_MAX + 1` pointers per +/// heap, so `"512"` costs 2,052 bytes on a 32-bit target where 128 costs 516. +/// Nothing else moves — the bin geometry, `good_size` and every ABI-visible +/// answer are computed elsewhere and are unchanged, which is what makes this +/// safe to offer as a knob rather than a fork. +pub const SMALL_WSIZE_MAX: usize = if cfg!(ra_small_wsize = "256") { + 256 +} else if cfg!(ra_small_wsize = "512") { + 512 +} else { + 128 +}; /// Maximum "small" allocation in bytes (`MI_SMALL_SIZE_MAX` = 1 KiB on 64-bit). /// `mi_malloc_small` / `mi_zalloc_small` require `size <= SMALL_SIZE_MAX`. @@ -202,7 +228,16 @@ mod tests { fn constants_match_oracle_64bit() { // Pinned to mimalloc v2.4.5 on x86_64 / aarch64 (64-bit words). assert_eq!(INTPTR_SIZE, 8); + // `SMALL_WSIZE_MAX` is a knob (`ra_small_wsize`), so pin EACH ARM + // rather than the default's number -- the same treatment + // `ra_segment_size` gets below, and for the same reason: pinning only + // the default passes vacuously at every other setting. + #[cfg(not(any(ra_small_wsize = "256", ra_small_wsize = "512")))] assert_eq!(SMALL_SIZE_MAX, 1024); + #[cfg(ra_small_wsize = "256")] + assert_eq!(SMALL_SIZE_MAX, 2048); + #[cfg(ra_small_wsize = "512")] + assert_eq!(SMALL_SIZE_MAX, 4096); #[cfg(not(ra_small_profile))] assert_eq!(SEGMENT_SIZE, 32 * 1024 * 1024); // The small profile's geometry is a DECISION, pinned here so moving it diff --git a/crates/rusty_alloc/tests/alloc_core.rs b/crates/rusty_alloc/tests/alloc_core.rs index 13386dc..0d5fb28 100644 --- a/crates/rusty_alloc/tests/alloc_core.rs +++ b/crates/rusty_alloc/tests/alloc_core.rs @@ -342,6 +342,49 @@ fn align_storm() { } } +/// A huge block's usable size is what was asked for, rounded up to a slice — +/// not the chunk-rounded reservation it lives in. +/// +/// This is the deterministic half of `docs/plans/youslowbro.md` §3: `realloc` +/// copies `usable_size` bytes when it moves a block, and a 33 MB block used +/// to report the whole 64 MiB chunk pair as usable — so growing it copied +/// (and first-touched, on both sides) twice what the caller had written, and +/// a consumer measured the step at 1.41x mimalloc. The reservation itself is +/// unchanged; only what is REPORTED, and therefore what is copied and what +/// `zalloc` zeroes on a recycled chunk. +#[test] +fn huge_usable_size_is_the_request_not_the_reservation() { + use rusty_alloc::types::{SEGMENT_SIZE, SEGMENT_SLICE_SIZE}; + for mb in [33usize, 64] { + let size = mb << 20; + assert!(size > SEGMENT_SIZE, "{mb} MB must be a huge allocation"); + let p = malloc(size); + assert!(!p.is_null(), "malloc({size})"); + // SAFETY: fresh live block of ≥ size bytes; freed once below. + unsafe { + let us = usable_size(p); + assert!(us >= size, "usable {us} < requested {size}"); + assert!( + us < size + SEGMENT_SLICE_SIZE, + "usable {us} for a {mb} MB block reports the reservation \ + ({} would be the chunk boundary), not the request", + size.div_ceil(SEGMENT_SIZE) * SEGMENT_SIZE + ); + // The bytes a move preserves are exactly the ones the caller + // could have written: fill the whole usable extent, grow past + // the reservation, and check the prefix survived. + p.write(0xA5); + p.add(us - 1).write(0x5A); + let np = realloc(p, 2 * size); + assert!(!np.is_null(), "realloc({size} -> {})", 2 * size); + assert_eq!(np.read(), 0xA5); + assert_eq!(np.add(us - 1).read(), 0x5A); + assert!(usable_size(np) >= 2 * size); + free(np); + } + } +} + #[test] fn realloc_storm() { // Seeded randomized realloc churn with content verification — the M3 diff --git a/crates/rusty_alloc/tests/loom_xthread.rs b/crates/rusty_alloc/tests/loom_xthread.rs index fcfc140..e2ad0fa 100644 --- a/crates/rusty_alloc/tests/loom_xthread.rs +++ b/crates/rusty_alloc/tests/loom_xthread.rs @@ -90,16 +90,19 @@ impl Model { break; } } - // Restore DELAYED (list bits may have changed? no — - // only WE can push while FREEING; owner may collect - // though, so re-read and preserve the pointer bits). + // Release FREEING to NORMAL, as `page::remote_free` + // does for a multi-block page (upstream's + // MI_NO_DELAYED_FREE): the delayed entry just pushed + // is what makes the owner un-park the page, and later + // remotes then push onto the page list. Re-read and + // preserve the pointer bits — the owner may collect. loop { let y = self.xthread.load(Ordering::Acquire); if self .xthread .compare_exchange( y, - (y & !XMASK) | DELAYED, + (y & !XMASK) | NORMAL, Ordering::AcqRel, Ordering::Relaxed, ) @@ -216,8 +219,9 @@ fn delayed_push_vs_abandon() { }); } -/// Extended soak (set LOOM_EXTENDED=1; CI nightly): two remotes vs the -/// abandoner under a preemption bound — the wide-space variant. +/// Extended soak (set LOOM_EXTENDED=1): two remotes vs the abandoner under a +/// preemption bound — the wide-space variant. No CI workflow runs it (none of +/// `.github/workflows` mentions loom); it is run by hand, for ~45 minutes. #[test] fn delayed_push_vs_abandon_two_remotes_extended() { if std::env::var_os("LOOM_EXTENDED").is_none() { @@ -248,6 +252,34 @@ fn delayed_push_vs_abandon_two_remotes_extended() { }); } +/// A parked (DELAYED) page receives TWO remote frees while the owner drains +/// its delayed list and collects: the first goes to the delayed list and +/// releases the page to NORMAL, the second lands on the page list. Every +/// block must end in exactly one place, and the heap is never touched after +/// FREEING is released. +#[test] +fn delayed_then_normal_vs_owner() { + loom::model(|| { + let m = Arc::new(Model::new(DELAYED)); + let m1 = m.clone(); + let t1 = thread::spawn(move || { + m1.remote_free(1); + m1.remote_free(2); + }); + let mo = m.clone(); + let to = thread::spawn(move || mo.owner_drain_delayed() + mo.owner_collect()); + t1.join().unwrap(); + let during = to.join().unwrap(); + let after = m.owner_drain_delayed() + m.owner_collect(); + assert_eq!(during + after, 2, "a block was lost or double-counted"); + assert_eq!( + m.xthread.load(Ordering::Relaxed) & XMASK, + NORMAL, + "the page must be left scannable" + ); + }); +} + /// Remote NORMAL pushes race the owner's collect; nothing may be lost. #[test] fn normal_push_vs_collect() { diff --git a/crates/rusty_alloc/tests/options_env.rs b/crates/rusty_alloc/tests/options_env.rs new file mode 100644 index 0000000..bc01edc --- /dev/null +++ b/crates/rusty_alloc/tests/options_env.rs @@ -0,0 +1,97 @@ +//! The environment pass still READS the environment now that it owns no +//! memory (`options::env`, `docs/plans/youslowbro.md` §4). +//! +//! The pass runs once per process, on the first option read, so the only way +//! to test it end to end is a CHILD with the variables set before it starts — +//! the same shape `foreign_free.rs` and `double_free.rs` use. The parent sets +//! both prefixes, both value grammars and a precedence conflict; the child +//! reads them back through the public `options::get`. + +use std::process::Command; + +use rusty_alloc::options::{get, get_size, is_enabled}; + +const MARKER: &str = "RUSTY_ALLOC_OPTIONS_ENV_CHILD"; + +// ABI indices (see `options::OPTION_NAMES`). +const MAX_ERRORS: usize = 19; +const MAX_WARNINGS: usize = 20; +const PURGE_DELAY: usize = 15; +const SHOW_STATS: usize = 1; +const ARENA_RESERVE: usize = 23; +const OS_TAG: usize = 18; +const MAX_SEGMENT_RECLAIM: usize = 21; + +fn child() -> ! { + // Touch the allocator first, as any real process does: the pass has run + // by the time `get` is called, whichever order the harness chose. + let v = rusty_alloc::alloc::malloc(64); + assert!(!v.is_null()); + // SAFETY: live block, freed once. + unsafe { rusty_alloc::alloc::free(v) }; + + assert_eq!(get(MAX_ERRORS), 7, "RUSTY_ALLOC_MAX_ERRORS"); + assert_eq!( + get(MAX_WARNINGS), + 11, + "MIMALLOC_MAX_WARNINGS (compat prefix)" + ); + assert_eq!(get(PURGE_DELAY), 5, "RUSTY_ALLOC_ wins over MIMALLOC_"); + assert!(is_enabled(SHOW_STATS), "MIMALLOC_SHOW_STATS=YES (any case)"); + assert_eq!( + get_size(ARENA_RESERVE), + 4096 * 1024, + "RUSTY_ALLOC_ARENA_RESERVE in KiB" + ); + // The one-walk pass (Linux) must keep `getenv`'s semantics exactly. + assert_eq!( + get(OS_TAG), + 3, + "a RUSTY_ALLOC_ value too long to be an option reads as unset: MIMALLOC_ applies" + ); + assert_eq!( + get(MAX_SEGMENT_RECLAIM), + 10, + "a present but unparsable RUSTY_ALLOC_ value keeps the default; MIMALLOC_ is not read" + ); + assert_eq!(get(MAX_ERRORS), 7, "a longer look-alike key does not match"); + // The exit CODE is the signal: libtest captures a test's stdout and never + // flushes it through `process::exit`, and a plain 0 is also what a + // harness that never reached this function would return. + std::process::exit(CHILD_OK); +} + +const CHILD_OK: i32 = 42; + +#[test] +#[cfg_attr(miri, ignore)] // spawns a child process +fn environment_variables_reach_the_options_table() { + if std::env::var(MARKER).is_ok() { + child(); + } + let exe = std::env::current_exe().expect("current_exe"); + let out = Command::new(exe) + .env(MARKER, "1") + .env("RUSTY_ALLOC_MAX_ERRORS", "7") + .env("MIMALLOC_MAX_WARNINGS", " 11 ") + .env("RUSTY_ALLOC_PURGE_DELAY", "5") + .env("MIMALLOC_PURGE_DELAY", "9") + .env("MIMALLOC_SHOW_STATS", "YES") + .env("RUSTY_ALLOC_ARENA_RESERVE", "4096") + .env("RUSTY_ALLOC_OS_TAG", "1".repeat(70)) + .env("MIMALLOC_OS_TAG", "3") + .env("RUSTY_ALLOC_MAX_SEGMENT_RECLAIM", "abc") + .env("MIMALLOC_MAX_SEGMENT_RECLAIM", "4") + .env("RUSTY_ALLOC_MAX_ERRORSX", "99") + .arg("--test-threads=1") + .output() + .expect("spawn child"); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + assert_eq!( + out.status.code(), + Some(CHILD_OK), + "child did not read its environment back\nstatus: {:?}\nstdout:\n{stdout}\nstderr:\n{stderr}", + out.status + ); +} diff --git a/crates/rusty_alloc_api/src/lib.rs b/crates/rusty_alloc_api/src/lib.rs index 1de5dfb..9633b10 100644 --- a/crates/rusty_alloc_api/src/lib.rs +++ b/crates/rusty_alloc_api/src/lib.rs @@ -21,6 +21,21 @@ pub use rusty_alloc::{MI_COMPAT_VERSION, VERSION, version}; /// The global allocator handle (zero-sized). pub struct RustyAlloc; +/// One machine word: every block the allocator hands out is aligned this far. +const WORD: usize = core::mem::size_of::(); + +/// The alignment the size classes already give every block of MORE than one +/// word: `bins::bin` rounds word counts up to even ones (upstream's +/// `MI_ALIGN2W`), and every page area starts on a slice boundary, so a block +/// of two words or more sits on a two-word boundary — 16 bytes on a 64-bit +/// target, `MAX_ALIGN_SIZE`. Only the one-word class is not, which is why a +/// request aligned between one and two words is raised to two words. +/// +/// This is the alignment hashbrown asks for on every table (its SSE2 control +/// group is 16 bytes), so a Rust `HashMap` used to go through the aligned +/// path on every allocation and through allocate-copy-free on every realloc. +const NATURAL_ALIGN: usize = 2 * WORD; + /// A first-class heap (plan §5.14): `Drop` runs `mi_heap_delete` semantics /// (blocks migrate to the thread's backing heap and stay valid) unless built /// with [`Heap::new_destroyable`], where `Drop` releases every block at once. @@ -136,40 +151,97 @@ impl Drop for Heap { // SAFETY: GlobalAlloc contract — Layout-described allocation/free delegated to // the rusty_alloc core, which returns blocks satisfying the layout's size and -// alignment (natural bins for align ≤ 8; the aligned path otherwise) and -// accepts any such block back in `free` regardless of which thread frees it -// (M4: per-thread heaps, no lock — `free` routes by the segment's owner and +// alignment (natural bins up to `NATURAL_ALIGN`; the aligned path above it) +// and accepts any such block back in `free` regardless of which thread frees +// it (M4: per-thread heaps, no lock — `free` routes by the segment's owner and // hands cross-thread blocks to the loom-modeled remote protocol). +// +// Every method is `#[inline]`, as the `mimalloc` crate's are. rustc generates +// `__rust_alloc` and friends in the crate that declares `#[global_allocator]`, +// and without the hint each one was a shim that loaded `&self`, shuffled the +// arguments and jumped through the GOT into an out-of-line method — on every +// Rust allocation and every drop. With it the fast paths land in the shims and +// in their callers. Measured whole-program (callgrind, same output): a boxed- +// tree/buffer/`Rc` workload −17.9 %, a HashMap/BTreeMap/String one −4.8 %, for +// +1,888 and +2,784 bytes of text. unsafe impl GlobalAlloc for RustyAlloc { + #[inline] unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - if layout.align() <= 8 { + if layout.align() <= WORD { rusty_alloc::alloc::malloc(layout.size()) + } else if layout.align() <= NATURAL_ALIGN { + // See `NATURAL_ALIGN`: a class of two words or more is already + // aligned this far, so only a one-word request needs raising. + rusty_alloc::alloc::malloc(layout.size().max(NATURAL_ALIGN)) } else { - rusty_alloc::alloc::malloc_aligned(layout.size(), layout.align()) + // SAFETY: `Layout` guarantees a power-of-two alignment, the one + // precondition `malloc_aligned_pow2` adds over `malloc_aligned`. + unsafe { rusty_alloc::alloc::malloc_aligned_pow2(layout.size(), layout.align()) } } } + #[inline] unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) { - // SAFETY: GlobalAlloc contract — ptr came from `alloc` and is freed once. - unsafe { rusty_alloc::alloc::free(ptr) } + // `free_inline`, not `free`: `dealloc` IS a free and does nothing + // else, the case `free_inline` exists for (the LD_PRELOAD export is + // the other). Through `free` every Rust deallocation paid a `jmp` + // into it and its null test; `GlobalAlloc` never passes null, and the + // hint lets that test fold away. + // SAFETY: GlobalAlloc contract — ptr came from `alloc`, is non-null + // and is freed once. + unsafe { + core::hint::assert_unchecked(!ptr.is_null()); + rusty_alloc::alloc::free_inline(ptr) + } } + #[inline] unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { - if layout.align() <= 8 { + if layout.align() <= WORD { rusty_alloc::alloc::zalloc(layout.size()) + } else if layout.align() <= NATURAL_ALIGN { + rusty_alloc::alloc::zalloc(layout.size().max(NATURAL_ALIGN)) } else { rusty_alloc::alloc::zalloc_aligned(layout.size(), layout.align()) } } + #[inline] unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { - if layout.align() <= 8 { - // SAFETY: GlobalAlloc contract — ptr live, invalidated on move; - // our realloc preserves min(old, new) bytes. - unsafe { rusty_alloc::alloc::realloc(ptr, new_size) } + if layout.align() <= NATURAL_ALIGN { + // Up to `NATURAL_ALIGN` the size classes carry the alignment, so + // the in-place arm is open to these layouts too: a block that + // stays keeps its address, and a move lands in a class of at + // least two words. Before this, every realloc aligned above one + // word (a growing `Vec`, say) was an allocate-copy-free. + let new_size = if layout.align() <= WORD { + new_size + } else { + new_size.max(NATURAL_ALIGN) + }; + // SAFETY: GlobalAlloc contract — ptr live and non-null, + // invalidated on move; our realloc preserves min(old, new) bytes. + // The hint lets `realloc`'s null arm fold away. + unsafe { + core::hint::assert_unchecked(!ptr.is_null()); + rusty_alloc::alloc::realloc(ptr, new_size) + } } else { - // Aligned realloc lands in M5; the default alloc-copy-dealloc is - // correct through our aligned paths meanwhile. + // Above `NATURAL_ALIGN`. The block already satisfies + // `layout.align()` and keeps it if it stays, so when the new size + // fits and at least half the block stays in use — `realloc`'s own + // in-place rule, which `mi_realloc_aligned` applies too — it + // stays. This arm used to allocate, copy and free every time, + // shrinks and fits included (bench/rust-globalalloc + // `overaligned`). + // SAFETY: GlobalAlloc contract — ptr is a live, non-null block + // of ours. + let usable = unsafe { rusty_alloc::alloc::usable_size(ptr) }; + if new_size <= usable && new_size >= usable / 2 { + return ptr; + } + // Otherwise allocate through the aligned path, copy the bytes the + // layout says are live, free. // SAFETY: forwarded GlobalAlloc contract. unsafe { let new_layout = Layout::from_size_align_unchecked(new_size, layout.align()); diff --git a/crates/rusty_alloc_api/tests/natural_align.rs b/crates/rusty_alloc_api/tests/natural_align.rs new file mode 100644 index 0000000..f8f8ae8 --- /dev/null +++ b/crates/rusty_alloc_api/tests/natural_align.rs @@ -0,0 +1,142 @@ +//! `GlobalAlloc` serves layouts aligned up to two words from the natural size +//! classes (`NATURAL_ALIGN` in `lib.rs`), trusting that every class of two +//! words or more is two-word aligned. This pins that trust for every small +//! size, across the medium and large bands and into huge, through `alloc`, +//! `alloc_zeroed` and every `realloc` step between them — including the +//! one-word requests that must be raised to reach an aligned class. + +use rusty_alloc_api::RustyAlloc; +use std::alloc::{GlobalAlloc, Layout}; + +/// Two words: 16 on a 64-bit target, the alignment hashbrown asks for. +const NATURAL: usize = 2 * core::mem::size_of::(); + +fn sizes() -> impl Iterator { + (0..=4200usize).chain([ + 8191, + 16_385, + 65_535, + 131_072, + 300_001, + 1 << 20, + (4 << 20) + 3, + ]) +} + +#[test] +fn natural_alignment_holds_for_alloc_zeroed_and_realloc() { + let a = RustyAlloc; + let align = NATURAL; + { + let mut prev: Option<(*mut u8, Layout)> = None; + for size in sizes() { + let l = Layout::from_size_align(size, align).unwrap(); + // SAFETY: valid layout; each block is freed exactly once below. + unsafe { + let p = a.alloc(l); + assert!(!p.is_null()); + assert_eq!(p.addr() % align, 0, "alloc({size}, {align}) misaligned"); + p.write_bytes(0xA5, size); + a.dealloc(p, l); + + let z = a.alloc_zeroed(l); + assert!(!z.is_null()); + assert_eq!( + z.addr() % align, + 0, + "alloc_zeroed({size}, {align}) misaligned" + ); + assert!(std::slice::from_raw_parts(z, size).iter().all(|&b| b == 0)); + a.dealloc(z, l); + + // Walk one block through every size: grows, and (at the + // jumps back down between bands) shrinks, in place or moved. + let (q, ql) = match prev.take() { + None => { + let q = a.alloc(l); + q.write_bytes(0x5A, size); + (q, l) + } + Some((old, ol)) => { + let q = a.realloc(old, ol, size); + assert!(!q.is_null()); + let keep = ol.size().min(size); + assert!( + std::slice::from_raw_parts(q, keep) + .iter() + .all(|&b| b == 0x5A), + "realloc {} -> {size} lost bytes", + ol.size() + ); + q.add(keep).write_bytes(0x5A, size - keep); + (q, l) + } + }; + assert_eq!( + q.addr() % align, + 0, + "realloc(.., {size}) at {align} misaligned" + ); + prev = Some((q, ql)); + } + } + if let Some((q, ql)) = prev { + // SAFETY: last live block of the walk. + unsafe { a.dealloc(q, ql) }; + } + } +} + +/// Above two words `realloc` may now keep a block in place. Walk one block +/// up and down through sizes at alignments the classes do not give for free: +/// every result must keep the alignment and the live prefix. +#[test] +fn over_aligned_realloc_keeps_alignment_and_bytes() { + let a = RustyAlloc; + for align in [64usize, 4096] { + let steps = [ + 64usize, 128, 100, 64, 40, 700, 350, 5000, 2600, 70_000, 36_000, 64, + ]; + let mut l = Layout::from_size_align(steps[0], align).unwrap(); + // SAFETY: valid layout; the block is realloc'd through the walk and + // freed once at the end. + unsafe { + let mut p = a.alloc(l); + assert!(!p.is_null()); + for (i, b) in std::slice::from_raw_parts_mut(p, l.size()) + .iter_mut() + .enumerate() + { + *b = i as u8; + } + for &next in &steps[1..] { + let q = a.realloc(p, l, next); + assert!(!q.is_null()); + assert_eq!( + q.addr() % align, + 0, + "realloc {} -> {next} at {align}", + l.size() + ); + let keep = l.size().min(next); + assert!( + std::slice::from_raw_parts(q, keep) + .iter() + .enumerate() + .all(|(i, &b)| b == i as u8), + "realloc {} -> {next} at {align} lost bytes", + l.size() + ); + for (i, b) in std::slice::from_raw_parts_mut(q, next) + .iter_mut() + .enumerate() + { + *b = i as u8; + } + p = q; + l = Layout::from_size_align(next, align).unwrap(); + } + a.dealloc(p, l); + } + } +} diff --git a/crates/rusty_alloc_api/tests/reentrancy.rs b/crates/rusty_alloc_api/tests/reentrancy.rs new file mode 100644 index 0000000..08ebcd2 --- /dev/null +++ b/crates/rusty_alloc_api/tests/reentrancy.rs @@ -0,0 +1,129 @@ +//! The allocator must never allocate THROUGH the global allocator while it is +//! serving a request. +//! +//! It did: the options environment pass in `options.rs` built its keys with +//! `to_uppercase` and `format!` and read them with `std::env::var`, all of +//! which return owned `String`s — **251 allocations re-entered the global +//! allocator on the first allocation of every process** on Windows (fewer on +//! Linux, where `std::env::var` allocates less per call), each landing in the +//! heap that was still being set up. mimalloc makes none. Reported from a +//! consumer behind a counting `GlobalAlloc` (`docs/plans/youslowbro.md` §4); +//! this test is that instrument, made permanent. +//! +//! The wrapper counts a call as re-entrant when it arrives while the same +//! thread is already inside one — a per-thread depth, so concurrent threads +//! cannot produce a false positive. The counter is cumulative from process +//! start, so the harness's own first allocation (which runs the pass) is +//! covered without any ordering assumption about which test runs first. + +use std::alloc::{GlobalAlloc, Layout}; +use std::cell::Cell; +use std::hint::black_box; +use std::sync::atomic::{AtomicUsize, Ordering::Relaxed}; + +use rusty_alloc_api::RustyAlloc; + +static CALLS: AtomicUsize = AtomicUsize::new(0); +static REENTRANT: AtomicUsize = AtomicUsize::new(0); + +thread_local! { + // `const` and `Copy`: no lazy initialisation and no destructor, so reading + // it inside the allocator allocates nothing and cannot fail at thread exit. + static DEPTH: Cell = const { Cell::new(0) }; +} + +struct Counting; + +impl Counting { + /// Enter one allocator call; `true` when this thread was already inside one. + fn enter() -> bool { + CALLS.fetch_add(1, Relaxed); + let nested = DEPTH.with(|d| { + let n = d.get(); + d.set(n + 1); + n > 0 + }); + if nested { + REENTRANT.fetch_add(1, Relaxed); + } + nested + } + + fn leave() { + DEPTH.with(|d| d.set(d.get() - 1)); + } +} + +// SAFETY: every method forwards to `RustyAlloc` with the same arguments and +// returns its result unchanged; the bookkeeping around the call touches only +// atomics and a `Copy` thread-local. +unsafe impl GlobalAlloc for Counting { + unsafe fn alloc(&self, l: Layout) -> *mut u8 { + Counting::enter(); + // SAFETY: forwarded GlobalAlloc contract. + let p = unsafe { RustyAlloc.alloc(l) }; + Counting::leave(); + p + } + + unsafe fn dealloc(&self, p: *mut u8, l: Layout) { + Counting::enter(); + // SAFETY: forwarded GlobalAlloc contract. + unsafe { RustyAlloc.dealloc(p, l) }; + Counting::leave(); + } + + unsafe fn alloc_zeroed(&self, l: Layout) -> *mut u8 { + Counting::enter(); + // SAFETY: forwarded GlobalAlloc contract. + let p = unsafe { RustyAlloc.alloc_zeroed(l) }; + Counting::leave(); + p + } + + unsafe fn realloc(&self, p: *mut u8, l: Layout, n: usize) -> *mut u8 { + Counting::enter(); + // SAFETY: forwarded GlobalAlloc contract. + let q = unsafe { RustyAlloc.realloc(p, l, n) }; + Counting::leave(); + q + } +} + +#[global_allocator] +static A: Counting = Counting; + +#[test] +fn the_allocator_never_re_enters_the_global_allocator() { + // Walk every regime once so the paths that set state up have all run on + // this thread: a fresh heap's first small block, a medium page, a large + // span, a dedicated huge segment, a moving realloc, and a cross-thread + // free (a worker's heap is created, used and abandoned). + let small = black_box(vec![1u8; 64]); + let medium = black_box(vec![2u8; 8 << 10]); + let large = black_box(vec![3u8; 300 << 10]); + #[cfg(not(miri))] + let huge = black_box(vec![4u8; 33 << 20]); + let mut grown: Vec = Vec::with_capacity(8); + grown.extend(0..(1 << 16)); + let from_worker = std::thread::spawn(|| black_box(vec![5u8; 4096])) + .join() + .expect("worker"); + drop((small, medium, large, black_box(grown), from_worker)); + #[cfg(not(miri))] + drop(huge); + + let calls = CALLS.load(Relaxed); + let reentrant = REENTRANT.load(Relaxed); + println!("global allocator calls so far: {calls}, re-entrant: {reentrant}"); + assert!( + calls > 0, + "the counting wrapper is not the global allocator" + ); + assert_eq!( + reentrant, 0, + "rusty_alloc allocated through the global allocator {reentrant} times \ + while serving a request — the start-up options pass used to do this \ + 251 times (docs/plans/youslowbro.md §4)" + ); +} diff --git a/crates/rusty_alloc_ffi/src/lib.rs b/crates/rusty_alloc_ffi/src/lib.rs index 64240ed..c18e49e 100644 --- a/crates/rusty_alloc_ffi/src/lib.rs +++ b/crates/rusty_alloc_ffi/src/lib.rs @@ -678,7 +678,9 @@ pub unsafe fn posix_memalign_impl(out: *mut *mut c_void, alignment: usize, size: if alignment & (alignment - 1) != 0 { return einval(); // not a power of two } - let p = alloc::malloc_aligned(size, alignment); + // SAFETY: `alignment` was proven a power of two just above, which is the + // one precondition `malloc_aligned_pow2` adds — it skips re-testing it. + let p = unsafe { alloc::malloc_aligned_pow2(size, alignment) }; if p.is_null() { return enomem(); } @@ -2082,7 +2084,21 @@ pub extern "C" fn mi_new_aligned(size: usize, alignment: usize) -> *mut c_void { /// Sibling of [`new_impl`]. #[inline] pub fn new_aligned_impl(size: usize, alignment: usize) -> *mut c_void { - let p = alloc::malloc_aligned(size, alignment); + // C++ requires `align_val_t` to be a power of two; test it the cheap way + // (`x & (x - 1)`: `is_power_of_two()` is a SWAR popcount without + // `popcnt`) and take the inline `malloc_aligned_pow2` fast path, as + // `posix_memalign` does. Anything else keeps the old route and its error. + // Measured on `bench/alignednew.cpp`: see the LEDGER, CURIOSITY ROUND FOUR. + #[allow( + clippy::manual_is_power_of_two, + reason = "is_power_of_two() is a SWAR popcount here; see above" + )] + let p = if alignment != 0 && alignment & (alignment - 1) == 0 { + // SAFETY: `alignment` was just shown to be a power of two. + unsafe { alloc::malloc_aligned_pow2(size, alignment) } + } else { + alloc::malloc_aligned(size, alignment) + }; if p.is_null() { new_aligned_oom(); } diff --git a/docs/LEDGER.md b/docs/LEDGER.md index a4eb507..6ca1413 100644 --- a/docs/LEDGER.md +++ b/docs/LEDGER.md @@ -4,6 +4,567 @@ One entry per milestone/brick: what landed, the numbers with their method lines, what was reverted and **which kind** of revert (measured-worse vs within-noise). Newest first. +## DOWNSTREAM CORPUS — real consumers on this tree after four curiosity rounds (2026-09-25) + +Every consumer below built against THIS working tree, verified per row from +the candidate's `Cargo.lock` (`rusty_alloc` 2.2.0 by path, no registry +source) — a check the harness did not have, and whose absence had let two +rows pass while testing the crates.io allocator (`tools/corpus/README.md`, +lessons 5–7). + +| check | platform | result | +|---|---|---| +| `tools/corpus/run.sh --test`: spacedb-sdk, spacedb-sdk `secure`, rusty_alloc_default, rusty_zstd, spacedb published mirror | Windows | **5 PASS** | +| same: rusty_maplibre | Windows | FAIL on the known 2.0.0 `no_std` break; with the documented migration, **1,199 passed, 0 failed** | +| spacedb-sdk and `secure`, rusty_zstd (C cross tests vs zstd 1.5.7) | Linux | 12 + 12 + **174 passed, 0 failed** | +| SpaceDB whole workspace, this tree `LD_PRELOAD`ed into every test binary | Linux | **314 passed, 0 failed** | +| rusty_zstd whole workspace (lib/bins/tests), preloaded | Linux | **194 passed, 0 failed** | +| Silesia, 12 files × levels 1/3/9/19 plus `-T4`, through `rzstd` | Windows and Linux | **60 + 60 cases, 0 failures** | + +The Silesia check, per file and level: this tree's `rzstd` compresses +**byte-identically** to the same CLI on the published allocator (2.0.5), its +frame decodes to the original through itself and through C zstd, and it +decodes C zstd's own frame. The `-T4` runs put cross-thread frees under a +real multi-threaded workload. + +Not ours, reported for the owners: rusty_zstd's ignored +`encode::tests::size_table_silesia` panics at `encode/tables.rs:850`, a +`debug_assert!` on the 24-bit position field of a packed chain head, when a +debug build reaches the 51 MB `mozilla`. It fails identically on the system +allocator (control run), and release builds, which skip the assertion, +round-trip `mozilla` at every level above. SpaceDB's ignored set is five +README snippets marked `ignore`, not runtime tests. + +## CURIOSITY, ROUND FOUR — five more, and the allocator column that saw a quarter of the allocator (2026-09-25) + +**The instrument first, because it changes how every earlier entry reads.** +The "allocator-only Ir" column that rounds one to three quote summed the +lines of `callgrind_annotate` that carry the library's `[object]` tag — and +annotate prints that tag only on a function's FIRST line. Code inlined from +another source file (`page.rs` into `malloc`, `init.rs`'s TLS read, the +`page_extend` loop inside `grow_front`) prints untagged and was never +counted. On perl the column read 6.62 M; the allocator's real self cost is +**24.66 M**. The column is now an exact sum over the raw callgrind file by +each function's object (`objir.awk`: object names are compressed and may +first appear on a `cob=` line; the inclusive line after each `calls=` is +skipped), and it agreed to the instruction with whole-program Ir on the +brick that exposed it (perl −26,655 both ways, where the old column read ++0). Consequences for the earlier entries: every allocator-only DELTA quoted +there was a real saving but a subset of the true one, and every percentage +was taken against a base about 3–4x too small — lua's "40 % lighter" in +round one, lua −3.8 % and jq −2.4 % in round two. The whole-program columns, +which decided perl, sqlite and python, are unaffected. + +| instrument | before | after | Δ | +|---|---:|---:|---:| +| opscan `aligned` | 92.13 | 83.69 | **−9.2 %** | +| opscan `big` / `large` | 95.50 | 92.00 | −3.7 % | +| opscan `mixed` | 95.58 | 92.70 | −3.0 % | +| C++ `alignednew` (new, `bench/alignednew.cpp`) | 149.04 | 145.16 | −2.6 % | +| Rust `overaligned` (new), per 20,000 steps | 1,784,927 | 1,349,905 | **−24.4 %** | +| one-line `sort`, whole process | 1,371,706 | 1,349,222 | −1.6 % | + +| program | exact allocator Δ | whole-program Δ | +|---|---:|---:| +| perl | −35,612 | −53,352 | +| sqlite | −12,128 | −29,628 | +| python | −9,858 | −25,651 | +| gawk | −9,390 | −27,548 | +| lua | −9,002 | (moves run to run) | +| jq | −8,992 | (moves run to run) | + +**The five:** + +1. **The options pass walks the environment once** (`options.rs`, + `prim::env_for_each`, Linux). 38 options under two prefixes were 76 + `getenv` calls, each walking the whole environment: 27,011 instructions + on the first allocation of every process, 17,372 of them inside libc — 2 % + of a one-line `sort`, and 77 % of all the allocator work that process did. + One walk that looks only at entries starting with either prefix keeps the + old semantics exactly (first occurrence wins, a value too long for the + buffer reads as unset and falls back to `MIMALLOC_`, an unparsable + `RUSTY_ALLOC_` value keeps the default); `tests/options_env.rs` now pins + those three, on the old path (Windows) and the new one (Linux). The saving + grows with the environment: this box's shell has 21 variables. +2. **`malloc_aligned_pow2` is `#[inline]`**, so `posix_memalign` and + `GlobalAlloc` carry its fast path instead of calling it: `aligned` −8.44. +3. **The medium arm pops before it collects** (`heap.rs`). When the front + page's free list is non-empty the collect changed nothing the pop needed, + but it tested the list, read the cross-thread word and re-loaded the list + first — eight instructions on every medium hit. `malloc`'s own fast path + already pops without collecting; remote frees are still collected, and the + latch still set, when the list runs dry. `big`/`large` −3.50, `mixed` + −2.88, perl −26,655. +4. **C++ aligned `new` takes the pow2 fast path** (`rusty_alloc_ffi`): + `align_val_t` must be a power of two, tested the cheap way (`x & (x-1)`; + `is_power_of_two()` is a SWAR popcount without `popcnt`), with anything + else keeping the old checked route and its error. `alignednew` −3.88. +5. **`GlobalAlloc::realloc` above two words keeps a block in place** when + the new size fits and at least half stays — `realloc`'s own rule, which + `mi_realloc_aligned` applies too. It used to allocate, copy and free every + time; when it must move it still copies only the layout's live bytes. + `overaligned` −24.4 %; `tests/natural_align.rs` walks a block through + twelve sizes at 64- and 4096-byte alignment checking alignment and bytes. + +**Refuted:** moving `collect_inner`'s per-queue body out of line so the bin +scan keeps its pointer in a register (inlined, the body's calls spill it and +every EMPTY queue pays a reload and a store — nine instructions per bin, twice +per thread exit). The new `threads` workload gained 272 per thread, but the +split changed inlining around the generic path's periodic collect and every +opscan op got worse (`big`/`large` +4.00, `mixed` +2.89, perl +45,287, +python +79,035). Noted at the site. + +**Looked at and left:** a recycled segment's 47 KB header `memset` is 76 % +of a thread-churn workload's Ir, but glibc zeroes that size with `rep +stosb`, which callgrind counts once per byte — an instrument inflation, not +a target, and upstream zeroes the same header. jq retires ~700 emptied pages +and re-carves them; upstream retires non-sole empty pages immediately too, so +that is a memory policy, not a finding. + +**Gates:** Windows core suites at default, `debug_checks`, `secure` (144/0 +each), `blockmap` (146/0) and the small profile (143/0); api 8/0 on x86-64 +and on `i686-pc-windows-msvc`; ffi 8/0; Linux suites at default, +`debug_checks` and `secure` (141/0 each) and the thread-heavy tests ten times +each in release (0 failures); fmt clean; clippy clean on Windows and Linux +apart from the known `ra_small_wsize` cfg warnings; unsafe census 963 (+16, +each in `UNSAFE.md`). + +## CURIOSITY, ROUND THREE — five more, and the entry point no instrument could see (2026-09-24) + +Same discipline, one new instrument. Every instrument in this repository +drives the allocator through its C ABI, but every Rust deliverable reaches it +through `GlobalAlloc` — `__rust_alloc` and friends, generated in the crate that +declares `#[global_allocator]` — and nothing measured that path. Two +deterministic Rust workloads now do (`bench/rust-globalalloc.sh`: `maps`, hash +maps plus B-trees plus strings; `trees`, boxed trees plus buffers plus `Rc`), +read as whole-program Ir by the two-point estimator, with a checksum that must +match between arms. The mimalloc oracle build was also scanned: it is slower +than ours on every opscan op, so every target below came from our own code. + +| opscan | before | after | Δ | +|---|---:|---:|---:| +| **huge** | 629.00 | **293.00** | **−53.4 %** | +| big / large | 100.00 | 95.50 | −4.5 % | +| every other op | | | ±0.01 | + +| program | measure | before | after | Δ | +|---|---|---:|---:|---:| +| perl | whole | 772,938,946 | 772,484,781 | **−454,165** | +| sqlite | whole | 316,086,544 | 316,030,456 | −56,088 | +| python | whole | 512,666,763 | 512,625,101 | −41,662 | +| jq | allocator | 5,563,583 | 5,523,229 | −40,354 | +| Rust `trees` | whole, per 20,000 steps | 23,340,202 | 18,436,920 | **−21.0 %** (+2,080 B text) | +| Rust `maps` | whole, per 20,000 steps | 28,164,304 | 26,820,518 | **−4.8 %** (+2,976 B text) | + +**The five:** + +1. **`page_extend` links at least four blocks** (`page.rs`, `MIN_EXTEND`), as + upstream's `MI_MIN_EXTEND` does. Ours had an implicit floor of one, so every + class above 1 KiB was carved one to three blocks per extend — on perl 8,990 + of 10,639 extends linked ONE block, each a full generic trip (the remainder + loop ran 8,996 times over 8,990 calls). perl −453,584, sqlite −53,052, + `big`/`large` −4.50. The raised byte bound this site refuted in August cost + last-level misses (+2.2 % to +6.4 %); this floor, measured with cachegrind: + perl +4,487 D1 misses and **+9** LL, sqlite +55 D1 and +94 LL. +2. **`GlobalAlloc` serves alignment up to two words from the natural classes** + (`rusty_alloc_api`, `NATURAL_ALIGN`). `bins::bin` rounds to even word + counts, so every block of two words or more is two-word aligned — 16 bytes + on x86-64, which is what hashbrown asks for on every table. Those layouts + took the aligned path on every allocation and allocate-copy-free on every + realloc; now they are `malloc`/`realloc` with a one-word request raised to + two words. `tests/natural_align.rs` pins it for every size to 4,200 plus + medium, large and huge, through alloc, alloc_zeroed and a realloc walk; with + the raise removed it fails on the first size-0 request. On a 32-bit target + an align-8 layout of four bytes or less was previously given a one-word + (4-byte) block; the two-word rule covers it. +3. **`dealloc` carries the free body inline** with the non-null fact stated, + instead of a `jmp` to `free` and its null test: `maps` −230,000 at 40,000 + steps, about four instructions per drop. +4. **The `GlobalAlloc` methods are `#[inline]`**, as the `mimalloc` crate's + are. Without it each `__rust_*` shim loaded `&self`, shuffled arguments and + jumped through the GOT into an out-of-line method. With it the fast paths + land in the shims and in their callers: most of the Rust columns above. + Measured whole-program because an allocator-only filter undercounts once + the paths inline into the program's own functions. +5. **`span_mark` skips interior slices that already point home** + (`segment.rs`). Every slice of every span in a normal segment points back to + its span start (`span_mark` is the only writer; `debug_validate_segment` + checks it), so a span taken from the FRONT of a free span, or a freed span + that did not merge left, already carries every interior marker. The loop + rewrote them anyway — 31 of 31 slices, twice, per 2 MiB allocate-and-free. + Now only slices whose span start moved are written. This keeps the + invariant the August assessment declined to weaken (it only stops + re-storing values that already satisfy it). **`huge` −336.00 (−53 %).** + +**Refuted:** resolving the old block's free in `realloc`'s move arm before +the `memcpy` so the opaque call would not force a re-derivation (five +instructions per move). `free` stayed byte-identical, but LLVM re-loaded the +page index anyway and holding four values across the call cost a sixth +callee-saved register: `realloc` +8.00, lua +240,221, python +302,857. Noted +at the site. **Not built:** `mi_strndup` measures its length with a byte loop +where `strnlen` would do; no workload calls it, so no instrument could see a +change. + +**Gates:** Windows core suites at default, `debug_checks`, `secure` (144/0 +each), `blockmap` (146/0) and the small profile (143/0); api 7/0, and 7/0 +again on `i686-pc-windows-msvc`, where two words is 8 bytes; ffi 8/0; wasm32 +builds clean; +Linux suites at default, `debug_checks` and `secure` (141/0 each) and the +thread-heavy tests ten times each in release (0 failures); fmt clean; clippy +clean apart from the known `ra_small_wsize` cfg warnings; unsafe census 947, +unchanged. + +## CURIOSITY, ROUND TWO — ten more, a protocol change back to upstream's, and the instrument that lied about a tail jump (2026-09-24) + +Same method as the round below, with the real-program gate widened: four +more programs (Python with every object through malloc, jq, gawk, sort; +fixtures seeded, in a persistent WSL directory — `/tmp` is wiped when the VM +stops, which once handed jq a missing file and a 25x-too-small profile), two +more opscan ops (`shbench`, the sized C++ churn driver), and — after brick 7 +— a whole-program column beside the allocator-only one. + +**Cumulative, round one's final tree → this one** (opscan Ir/op; real +programs whole-program Ir, exact for perl/sqlite/python; allocator-only Ir +for lua and jq, whose whole count moves run to run): + +| opscan | before | after | Δ | +|---|---:|---:|---:| +| **xthread** | 112.59 | **77.29** | **−31.4 %** | +| realloc | 248.37 | 231.20 | −6.9 % | +| aligned | 94.50 | 92.13 | −2.5 % | +| calloc | 94.82 | 93.19 | −1.7 % | +| huge | 638.00 | 629.00 | −1.4 % | +| big / large / mixed | 101 / 101 / 96.54 | 100 / 100 / 95.58 | −1.0 % | +| every other op | | | −0.0 … −0.7 %, `usable` flat | + +| program | measure | before | after | Δ | +|---|---|---:|---:|---:| +| perl | whole | 773,394,562 | 772,937,623 | **−456,939** | +| python | whole | 513,051,186 | 512,661,300 | **−389,886** | +| sqlite | whole | 316,142,142 | 316,086,572 | −55,570 | +| lua | allocator | 9,485,488 | 9,120,942 | −364,546 (−3.8 %) | +| jq | allocator | 5,700,261 | 5,562,891 | −137,370 (−2.4 %) | + +**The ten:** + +1. **The OOM retry test moved to the exits that can fail** (`heap.rs`): the + walk's fresh-page carve and the large/huge arms, instead of the epilogue + of `malloc_generic_once`, where it sat after arms that cannot return + null. All seven programs improved; `huge` +1 (its arm tests itself). +2. **`realloc` decides a move in one compare, and each move knows its copy + length** (`alloc.rs`): the two-sided in-place test had compiled + branch-free (`setbe`/`shr`/`setae`), so every move paid all of it. Lua's + moves are growths, Python's are shrinks below half (60,100 of 60,669). + opscan `realloc` −16.31; lua −301,818, python −125,709 allocator Ir. +3. **The generic-collect countdown is one decrement** whose wrap means "was + zero" — a memory-destination `sub` and one branch instead of load, test, + branch, decrement, store: every program −708 … −59,630. +4. **A remote free to a parked page releases FREEING to NORMAL, as upstream + does** (`page.rs::remote_free`; upstream `_mi_free_block_mt` sets + `MI_NO_DELAYED_FREE`). We restored DELAYED, so every later remote free to + that page took the three-CAS delayed route and the owner freed each block + through `drain_delayed` + `free_local_at`; after NORMAL they are one CAS + onto the page's list, collected in bulk. Single-block pages (large, huge) + keep DELAYED — never scanned, the delayed list is their only route. + **opscan `xthread` −26.6 %**; single-threaded code byte-identical. Gates: + the loom protocol model updated to mirror it plus a new + `delayed_then_normal_vs_owner` model (a parked page takes a delayed push + and then a list push while the owner drains and collects — no block lost, + page left scannable), all five models green; Linux suites at default, + `debug_checks` and `secure`, and the thread-heavy tests (`double_free`, + `stress_mt`, `abandon_rss`, `heaps`, `openheimer`, `teardown_reclaim`) + **ten times each in release, 0 failures**; Windows suites green. +5. **`free_general` is frameless** (`alloc.rs`): `owner_heap`'s fallback — + `my_heap()`, which can create a heap — was a non-tail call inlined into + it, and that one call pinned a three-register frame on every general + free, remote ones included. The fallback is its own cold function + reached by a tail call: `xthread` −5.37, `huge` −6. +6. **`Heap::huge_alloc` is out of line**: `segment::huge_alloc` returns its + `Result` through a stack slot, and inlined, that slot put `sub`/`add + %rsp` on EVERY generic trip. All seven programs improved (−104,976 + allocator Ir). +7. **`calloc`'s sentinel test moved into its miss** (`alloc.rs::zalloc`): + the fast path is `malloc`'s raw-read shape, where the sentinel's empty + direct table already routes to the slow path. `calloc` −1.31; python + **−110,119 whole-program**. See the instrument note below — the + allocator-only column read +300,948 for this brick. +8. **The zero flag is a `u8` inside the generic chain** and a `bool` only at + `malloc_generic`: a `(*mut u8, bool)` pair return makes every caller + re-truncate the flag (`and $0x1,%dl`), which blocked the tail calls to + `grow_front` — the commonest generic outcome on a real program (jq: + 10,307 of 11,229 trips) — and to the walk. perl −67,053, jq −65,005, + python −41,375, lua −21,826 whole-program; `aligned` +0.06 (its slow + path converts at the `Heap` boundary). +9. **A medium miss grows the front page directly** (`heap.rs`): perl sent + 7,707 generic trips into the medium arm and 7,693 missed — the front + page dry but not fully carved — and then ran the heartbeat, derived the + same bin again and collected the same page again before reaching + `grow_front`. **perl −317,649, jq −593,325, sqlite −35,351 whole-program; + opscan `big`/`large` +1.00, `mixed` +0.66** — a recorded trade, real + programs being the verdict when the two instruments disagree in sign + (round one reverted a split on the same rule). The first version computed + `wsize_from_size` for `grow_front` and cost the hit path +5; `w` is now + passed as "above the direct table", the only thing `grow_front` reads it + for. +10. **`malloc_aligned_pow2`** for callers that have proven the alignment a + power of two — `posix_memalign` (which validates it for EINVAL) and + `GlobalAlloc` (whose `Layout` guarantees it): no second test. `aligned` + −2.00. + +**Refuted or not built this round:** `grow_front` as a tail call was first +blocked by the pair-return truncation (#8 fixed that); a running-pointer +`page_extend` is already a recorded refutation at the site; the span-marking +split and the `bins::bin` rewrite stay refuted from round one; `stats.extends` +stays live (release work-parity counter). + +**Instrument lesson — allocator-only Ir mis-attributes around a tail jump +into another object.** Brick 7 moved `calloc`'s `jmp *memset` from +`alloc::zalloc` into `alloc::calloc`; the per-object column then read python +**+300,948** while per-instruction totals (1,401,231 → 1,290,107 on the +calloc paths) and the whole-program count (−110,119) both said win. +callgrind's call-stack bookkeeping charges instructions differently when a +tail jump leaves the object. The gate now prints whole-program Ir beside the +allocator column, and a brick whose two columns disagree is decided by the +exact whole count. + +**Gates:** see the entry's commit. Also: the extended loom soak +(`LOOM_EXTENDED=1`, two remotes vs the abandoner) does NOT pass — on this +change or before it. It stops on loom's "Model exceeded maximum number of +branches" (`max_branches = 100_000`) after 46 minutes with the new model and +after 60 minutes with the committed one, so the overflow predates this +change; no assertion (lost block, use-after-free) fired in either. A run of +the new model with a tenfold budget was killed by the OS +(`STATUS_IN_PAGE_ERROR`, a full system drive) before a verdict. No CI +workflow runs loom at all; the test's comment claiming a nightly run was +wrong and has been corrected. Open item: find why one execution runs past +the budget (the two yield-spins on FREEING under a preemption bound are the +suspect) and make the soak pass. + +## CURIOSITY — ten instruction wins, seven refutations, and lua's allocator 40 % lighter (2026-09-24) + +Hunted with the `rusty-curiosity` discipline: profile, descend one layer +into the surprising number, read the siblings at the site, gate everything +on an exact instrument. Built on top of the YOU SLOW, BRO entry below. + +**Instruments.** Both exact, both in WSL on this box (callgrind 3.26, +rustc 1.97.1): the repo's `bench/opscan.c` two-point estimator, ra only, run +three times identical to the hundredth before anything was measured; and the +`icount-arms` real programs (perl and sqlite with the hash seed pinned, and +lua) reduced to allocator-only self Ir by object — identical to the +instruction across repeat runs, lua included. Per-instruction attribution +came from `callgrind --dump-instr` joined to `objdump`. Every brick was +built, scanned and put through the real-program gate before the next. + +**Cumulative, the tree at the start of this entry → the end:** + +| opscan op | before | after | Δ | +|---|---:|---:|---:| +| big / large | 121.00 | **101.00** | −16.5 % | +| mixed | 110.81 | **96.54** | −12.9 % | +| calloc | 107.57 | **94.82** | −11.9 % | +| huge | 689.00 | **638.00** | −7.4 % | +| med | 60.75 | 56.82 | −6.5 % | +| realloc | 259.86 | 248.37 | −4.4 % | +| small / small_touch | 54.39 / 60.39 | 52.27 / 58.27 | −3.9 % | +| aligned | 97.88 | 94.50 | −3.5 % | +| xthread, batch, liveset | | | −0.3 … −1.0 % | +| usable | 22.00 | 22.00 | 0 | + +| real program, allocator Ir | before | after | Δ | +|---|---:|---:|---:| +| **lua** | 15,781,865 | **9,485,488** | **−39.9 %** | +| perl | 7,124,383 | 7,002,677 | −1.7 % | +| sqlite | 1,418,197 | 1,389,797 | −2.0 % | + +**The ten, in order kept** (each measured alone against the one before): + +1. **`options::get` swapped an atomic on every read** (`options.rs`). The + `huge` op showed 19 Ir/op in `ensure_init` — `span_free` reads + `purge_delay` per span, and every read was a locked `swap` behind a call. + Load-first, swap in the cold arm: `huge` −17.00. +2. **A thread-local lookup hoisted above the test that guarded it** + (`options.rs`). `__tls_get_addr` on every slow-path allocation; the + disassembly loaded `DEFERRED_FUN` and called `__tls_get_addr` before + testing it. The re-entry guard moved into the cold hook caller: every op + improved, `huge` −20, `realloc` −3.44, `mixed` −2.50. +3. **`malloc_slow` had lost its tail call** (`heap.rs`). Its own doc says + "this arm must stay a TAIL call"; the later reclaim-and-retry wrapper + tested the result, which put the call back in non-tail position (16 Ir + around a jump). The test moved into `malloc_generic_once`'s epilogue: + `big`/`large` −7, `mixed` −5.06, `calloc` −4.69. +4. **`zalloc`'s miss pinned a frame on its hit path** (`heap.rs`). Out of + line and in tail position, the calloc fast path is a leaf ending in + `jmp memset`: `calloc` −4.56, perl −1,383. +5. **The keep-one-warm test was three branches** (`alloc.rs`, the `free` + asm label block). `used | next | prev == 0` is one test: −2.00 on every + alloc/free pair op, `realloc` −6.00. The first attempt edited + `retire_or_abort` — the function the comment names — and was flat; the + profile showed the hot copy inline in the label block. +6. **`realloc(NULL, n)` paid the move path's frame** (`alloc.rs`). Lua's + allocator routes EVERY allocation through `realloc`: 480,342 of 540,393 + calls had a null pointer, and each pushed and popped five registers to + reach `malloc`. The null test now sits in front of the frame, with the + live-pointer body in `realloc_live(NonNull, ..)` — `NonNull` because + the raw-pointer split let two null tests back in (+11.84 on opscan + `realloc`). **lua allocator −6,233,185 (−39.6 %)**, opscan `realloc` + −0.16. +7. **`span_free` read the purge option before testing the span length** + (`segment.rs`): `huge` −5, perl −924, lua −932, sqlite −296. +8. **A constant flag materialised and re-tested** (`heap.rs`, the medium + collect-and-retry). `(stole, pop)` as a tuple made LLVM merge the collect + outcomes, then `xor`/`test` a flag that is constant on the hit path. The + latch is now stored inside the branch that knows it: `big`/`large` −5, + `mixed` −3.31, perl −23,085, sqlite −2,727. +9. **The retry flag from #3 was a parameter** (`heap.rs`): a `mov $1` at the + call, a copy into a callee-saved register and a flag test before the null + test, on every generic trip. Now a thread-local read only on the OOM path: + every op improved (`huge` −6, `big`/`large` −4, `mixed` −2.89) and it + paid back #3's `aligned` +0.12; perl −56,937, lua −27,933, sqlite −10,020. +10. **`stats.delayed_frees` was a release counter** (`heap.rs`): a + read-modify-write per drained cross-thread block that only the stats + printer reads. Debug-only, like `allocs`/`frees`: `xthread` −0.77. + +**Refuted, each recorded at its site with its number:** + +- **Frameless medium entry** (split the generic path so the medium + collect-and-retry skips the four-register frame): opscan `big`/`large` + −11, `mixed` −6.83 — and every other generic trip +8, so real programs + went WORSE: lua +31,945, perl +23,549, sqlite +15,997. The opscan table + alone would have shipped it. +- **May-return abort in the collect walk**, to drop that entry's alignment + push: a call inside the loop keeps three values live; six-register frame, + `huge` +20. The trick only works in TAIL position. +- **`(w | 1).leading_zeros()`** in `bins::bin` to drop the zero-input + fallback: LLVM keeps the `leading_zeros` form; `big` +1, `aligned` +0.69. +- **Bin computed once** above both its uses in the generic path: live across + the heartbeat's calls, `big` +17, perl +101,962. +- **Owner-table `fill`** split out of the span-marking loop: both loops got + cheaper and the function dearer (two unroll setups and remainders); + `huge` +28 with a sign flip by span length on real programs. +- **A "table complete" flag** in `options::get` to skip the `i64::MIN` + sentinel: flat; the callers test the SIGN and LLVM already folds both into + one `js`. +- **Debug-only `stats.extends`** — not built: the release bench prints it + as a work-parity counter (`rusty_alloc_bench` `COUNTERS`, the wasm speed + probe), the same reason `stats.generic` stays live. Likewise inlining + `malloc_aligned` into the C shims, already refuted at +4.56 (2026-08-21). + +**Instrument lessons.** Twice a library that was never rebuilt read "+0.00 +on every op": first the 9p mtimes from a Windows edit, then `cargo` not on +`PATH` in a non-login shell, swallowed by `|| true`. The build helper now +refuses to report unless the library file is newer, and prints a code +checksum. And the per-instruction join is what found #2, #5, #6 and #8 — +each was invisible at function granularity. + +**Gates.** See the commit; `cargo test -p rusty_alloc` at default, +`debug_checks`, `secure`, `blockmap` and `--cfg ra_small_profile`; +`rusty_alloc-api` (incl. the re-entrancy gate) and `rusty_alloc-ffi`; +no_std `--cfg ra_single_threaded` check; clippy clean on the new code; +fmt; unsafe census 931 → 934 (`realloc_live`'s signature and block, and the +medium arm's collect/pop split into two blocks), each rowed in `UNSAFE.md`. +**Not measured:** wall clock (a Windows box at 60–75 % foreign load), and +mimalloc's arm — its opscan column is from earlier sessions. + +## YOU SLOW, BRO — a huge `realloc` copied its reservation, and 251 start-up allocations re-entered the allocator (2026-09-24) + +`docs/plans/youslowbro.md`, from `rusty_esp_sense` (a candle + rayon host +pipeline) measuring `rusty_alloc-api` 2.2.0 against mimalloc 0.1.52 and the +Windows heap on the patterns that pipeline produces: parity or better on 13 of +16 workloads, one real loss, one start-up cost, two memory notes. + +**Finding 1 — `realloc` that MOVES a huge block: 1.41x / 1.23x mimalloc, +0/6 pairs.** The report ruled out fresh huge allocation, reuse across sizes and +several live huge blocks with its own probes, and left four candidates. It was +B. `segment::huge_alloc` set the huge page's `block_size` to the whole +chunk-rounded reservation minus the header — a 33 MB request lives in a 64 MiB +chunk pair, a 64 MB one in 96 MiB — and `usable_size` is the length `realloc` +copies when it moves. Growing 33 MB therefore copied, and first-touched on both +sides, 64 MiB; growing 64 MB copied 96 MiB; `zalloc` on a recycled chunk +zeroed the same. Pinned by a test before anything was timed: +`tests/alloc_core.rs::huge_usable_size_is_the_request_not_the_reservation` +(the usable size of a 33 MiB and a 64 MiB block is within one slice of the +request, and a move preserves the whole of it). The fix is one line — +`block_size = align_up(size, SEGMENT_SLICE_SIZE).min(capacity)`, upstream's +`psize` — and the reservation is untouched, so nothing about placement, +arena recycling or `huge_free` moves. Not A: the copy was `memcpy` on both +sides. Not D: the paths were at parity in the report's own probe 3. + +**Static counts** (Windows x86-64 release, `cargo rustc --lib -- --emit asm`, +HEAD worktree vs tree, instructions per symbol): `alloc::realloc` 163 → 163, +`usable_size` 17 → 17, `free` 66 → 66, `page_extend` 42 → 42, `options::get` +20 → 20; `segment::huge_alloc` 199 → 203 (cold; the `min` and the round-up); +`options::ensure_init` 538 → 817 (runs once per process; the key-building loop +is now inline where `format!` and `to_uppercase` were calls into `std`). + +**Timing, on the consumer's own probe** (`F:/janus-data/raprobe`, copied to +scratch twice and patched through `[patch.crates-io]` to link the HEAD worktree +and the tree; a third copy links mimalloc). Method: whole processes pinned to +one core at High priority, ABBA with the leading arm swapped each round, +best-of-N inside each run, median and minimum of the per-run bests, paired +wins and z; the box sat at 62–76 % load from another process throughout, so +the **null arm** (one binary in both arms, 6 rounds) is the floor: median +ratios 0.89–1.03, no |z| ≥ 2. A verdict below needs |z| ≥ 2 AND a ratio +outside ±10 %. + +| workload | HEAD | tree | ratio | tree wins | z | +|---|---:|---:|---:|---:|---:| +| realloc step 33 → 66 MB | 7.707 ms | **5.243 ms** | **0.680** | **8/8** | +2.83 | +| realloc step 64 → 128 MB | 13.237 ms | **10.152 ms** | **0.767** | **8/8** | +2.83 | +| `Vec` growth by push to 64 MB × 3 | 45.201 ms | **36.673 ms** | **0.811** | **6/6** | +2.45 | +| realloc step 8 → 16 / 16 → 32 MB | | | 0.975 / 0.923 | 5/8, 6/8 | inside the floor | +| fresh 16–128 MB buffers, per buffer | | | 0.97–1.06 | 1–4/6 | inside the floor (path untouched) | + +Against mimalloc afterwards, same method, 8 and 6 rounds: **33 → 66 MB 1.013 +(5/8, z +0.71) — parity, was 1.407 at 0/6; 64 → 128 MB 0.969 (7/8, z +2.12) — +faster, was 1.233 at 0/6; `Vec` to 64 MB 1.015 (3/6) — parity, was 1.231 at +0/6.** Fresh 30–64 MB buffers stay at 1.02–1.06 (the report's 1.01–1.04): the +fix does not touch that path, and HEAD vs tree reads 3/6 there. + +**Finding 2 — 251 allocations through the global allocator on the first +allocation of every process.** `options::ensure_init` built 38 x 2 environment +keys with `to_uppercase` and `format!` and read them with `std::env::var`, +each an owned `String`, inside the heap being set up. Now: the key is built in +a stack buffer sized by the table (`KEY_CAP` is a `const` over +`OPTION_NAMES`), read through the new `prim::getenv` — `libc::getenv` on unix, +`GetEnvironmentVariableA` on Windows, the calls upstream's prim makes — into a +64-byte stack buffer, and parsed in place; Miri and wasm32-wasip1 keep a +`std::env` fallback, and wasm32-unknown-unknown keeps the pass compiled out so +the size ratchet is unmoved by construction. **On the consumer's counting +probe: 263 allocations at start-up → 12, and mimalloc reads 12 on the same +probe.** Two tests: `tests/options_env.rs` (a child process with both +prefixes, the precedence rule, the boolean grammar and KiB scaling set, read +back through `options::get`) and `rusty_alloc_api/tests/reentrancy.rs` (a +depth-counting `GlobalAlloc` around `RustyAlloc`: 395 calls, **0 re-entrant**; +it would have read 251). Unsafe census 928 → 931: one FFI block per prim +backend and one `set_var` in a test, each rowed in `UNSAFE.md`. + +**Not built, and why — `docs/opps.md` #10.** The old fat `usable_size` made a +`realloc` that fit inside the reservation's slack free, and that went with +the fix (upstream moves there too). Keeping it deliberately is a `HUGE_SEGMENT` +test in the move arm: a load and a branch on EVERY moving `realloc`, which is +the whole of the opscan `realloc` op, for a sub-2x grow of a block already +above 32 MiB that no report has named — the doublings consumers hit never fit. +Recorded with the hook, not built. + +**Memory notes (report §5).** README gained a *Memory* paragraph (freed memory +stays committed by default, `purge_delay` = -1, the retained working set and +how to purge). The consumer's `retain` probe reads identically before and +after — 461 MB retained after freeing 456 MB of huge blocks, 492 MB with 45 MB +of 224-byte blocks live, mimalloc 461 / 491 — and the mechanism is not a +missing recycler: the chunks come back through the arena bitmap and a fresh +segment takes one; what rises is first-touch of the pages a 38 MB block never +wrote in its 64 MiB pair. Backlog as `docs/opps.md` #11. + +**Gates.** `cargo test -p rusty_alloc` 144 passed / 0 failed (default), plus +`--features debug_checks` and `--features secure`; `rusty_alloc-api` tests +including the new re-entrancy gate; clippy clean on the new code (the tree +also carries `unexpected_cfgs` warnings for an unregistered `ra_small_wsize` +knob from uncommitted work outside this campaign, in `types.rs` and +`prim/fixed.rs`); `cargo fmt --check`; `tools/unsafe-census.sh --update`. +**Not measured:** callgrind — this is a Windows box; the icount farm re-reads +the opscan `realloc` and `huge` ops, where the static counts above predict +0 and +4. + ## OPENHEIMER, SPLIT — 202 findings, 139 withdrawn as hot-path tax; the one fix the log claimed and never wrote (2026-09-16) `docs/plans/openheimer-run.md`, from the campaign's red log diff --git a/docs/opps.md b/docs/opps.md index 7598722..54e1045 100644 --- a/docs/opps.md +++ b/docs/opps.md @@ -32,6 +32,8 @@ are to try. | 7 | `wait_no_remote_in_flight` 512-slot scan | 3 | latency | **LANDED — bounded to the carved region** | | 8 | Collect-loop double `block_next` | — | batch loss | **banked (landed)** | | 9 | `process_delayed` swaps an empty list every slow-path alloc | 3 | slow path | **LANDED — load-before-swap** | +| 10 | Huge `realloc` grows in place inside the reservation's slack | 3 | huge realloc | **NOT BUILT (2026-09-24) — no measured workload reaches it; a load and a branch on every moving realloc** | +| 11 | Recycle retained huge chunks' untouched tail for small objects | 3 | footprint | **OPEN — backlog from `docs/plans/youslowbro.md` §5** | --- @@ -309,6 +311,47 @@ so it would read as `aligned` regressing in every opscan. Not shipped; `page_collect`'s xthread steal was already load-guarded before it CASes, so #9 was the one place the pattern actually paid. +## From a consumer report — `docs/plans/youslowbro.md` (2026-09-24) + +### 10. Huge `realloc` in place inside the reservation — NOT BUILT + +**Where:** `alloc.rs::realloc`'s move arm; `segment.rs::huge_alloc`. + +A huge block's reservation is chunk-rounded — 64 MiB for a 33 MB request, 96 +MiB for 64 MB — so up to a chunk of committed, never-touched slack sits after +the block. Until 2026-09-24 the page REPORTED that slack as its usable size, +which made a `realloc` that fit inside it free and made every `realloc` past +it copy the whole slack: the 1.41x / 1.23x loss `youslowbro.md` §3 measured. +The fix reports the request (upstream's `psize`), and the in-place growth +went with it. + +It could be kept deliberately: in the move arm, if the page is `HUGE_SEGMENT` +and `newsize <= total_size - (block - seg)`, bump `block_size` and return +`p`. The arithmetic against building it now: the growth that consumers hit +is a `Vec` doubling (33 -> 66 MB, 64 -> 128 MB), which never fits the slack +(capacity 64 MiB - 64 KiB and 96 MiB - 64 KiB respectively), so the only +beneficiary is a sub-2x grow of a block already above 32 MiB — a pattern no +report has named — while the test is a flags load and a branch on EVERY +moving `realloc`, which is the whole of the `realloc` opscan op (277 Ir/op, +all moves). Not built. If a workload with that shape appears, price it on +opscan `realloc` first; the hook is a `#[cold]` arm after the in-place test, +and `total_size` already holds the capacity. + +### 11. Recycle a retained huge chunk's untouched tail for small objects — OPEN + +**Where:** `arena.rs` chunk bitmap; `segment.rs::segment_alloc`. + +`youslowbro.md` §5: after 456 MB of huge blocks are freed, 45 MB of 224-byte +blocks raise the working set from 461 to 494 MB — mimalloc reads 491, so it +is not a regression against upstream. The chunks DO come back through the +arena bitmap and a fresh segment takes one, so the recycling exists; what +rises is first-touch of the pages inside those chunks that the huge block +never wrote (a 38 MB block leaves 26 MB of its 64 MiB pair untouched). A +segment carved from a recycled chunk could prefer the touched prefix, or the +arena could hand a 64 MiB pair's touched half out first. Backlog: needs the +`retain` probe from the consumer's harness as its instrument, and a working +set number, not an instruction count, as its verdict. + ## Banked ### 8. Collect-loop double `block_next` — LANDED 2026-08-20 diff --git a/docs/plans/fast-trans.md b/docs/plans/finished/fast-trans.md similarity index 100% rename from docs/plans/fast-trans.md rename to docs/plans/finished/fast-trans.md diff --git a/docs/plans/finished/youslowbro.md b/docs/plans/finished/youslowbro.md new file mode 100644 index 0000000..d4b4216 --- /dev/null +++ b/docs/plans/finished/youslowbro.md @@ -0,0 +1,372 @@ +# You slow, bro? Where rusty_alloc loses, measured from a real consumer + +**Status: RESOLVED 2026-09-24 — see §8.** Both findings fixed and measured on +this report's own probe: the huge `realloc` steps went from 1.41x / 1.23x +mimalloc at 0/6 to 1.01x (parity) and 0.97x (7/8), and start-up allocations +from 263 to 12, which is mimalloc's own count on the same probe. Candidate B +was the mechanism. §5 got its README line and a backlog entry. + +Originally: measured, nothing implemented. · **Date:** 2026-09-24 · +**Build:** `rusty_alloc-api` **2.2.0 from crates.io** (not this repo's HEAD, +which has uncommitted changes that were left untouched) · **Box:** Windows 11 +Home, Intel i7-14650HX, 16 cores / 24 threads, 32 GB, **native Windows, not +WSL** · **Reference:** `mimalloc` 0.1.52 (`libmimalloc-sys` 0.1.49, built +from its C source) and the Windows system heap + +This note comes from outside the team. `rusty_esp_sense`, a Janus host +pipeline built on candle and rayon, adopted rusty_alloc as its binary's +global allocator. Its benchmark got **7.5 % faster** (1,945 → 1,759 ms, 15/16 +alternating pairs, z 3.50). While pricing that change we measured rusty_alloc +directly against mimalloc and the system heap on the allocation patterns +that pipeline produces. The short version: **you are not slow in general.** +There is one real loss, one start-up cost, and two memory notes worth +knowing. + +--- + +## 0. The answer in one paragraph + +Against mimalloc, rusty_alloc is at parity or better on 13 of the 16 +workloads we ran, and clearly faster on three of them (cross-thread free of +224 B blocks 0.73×, 24-thread churn of 4 KB blocks 0.77×, repeated fresh +blocks below 32 MiB 0.81-0.85×). **The one real loss is `realloc` that +moves a HUGE block.** Growing a block that is already larger than a segment +costs **1.41×** mimalloc's time for 33 → 66 MB and **1.23×** for +64 → 128 MB, and loses every pair (0/6). The same step below the segment +size is *faster* than mimalloc (0.87×, 0.93×). A realistic `Vec` that grows +to 64 MB by `push` pays it: **1.23×, 0/6**. Three mechanisms are already +ruled out (§3). Separately, **the options pass makes 251 allocations through +the global allocator** on the first allocation of every process, where +mimalloc makes none, and its source line is identified (§4). + +--- + +## 1. Method, and what makes a number admissible here + +- **One probe source, three binaries.** A small Rust program runs each + workload best-of-N and prints milliseconds. It is compiled three times: as + `#[global_allocator]` it uses `rusty_alloc_api::RustyAlloc`, + `mimalloc::MiMalloc` or `std::alloc::System`. All three sit behind the same + thin counting wrapper, so the counts in §4 are like for like. Source: + `F:/janus-data/raprobe/`, `cargo build --release --features rusty|mi`. +- **Alternating runs.** The binaries run in turn, 5 or 6 rounds each. The + verdict is the median of each arm's per-round best and the **paired win + count**. A cell below is a verdict only if one side won at least 5 of 6 + (or 5 of 5). +- **Wall clock only, no instruction counts.** This is a Windows host with no + callgrind. Every ranking here should be re-read on your deterministic + instrument before anything is built. +- **The box was loaded.** Another process held the CPU at up to 100 % + during these runs. Pairing cancels drift that both arms share; it does not + make small effects admissible. Read anything within ±5 % that lacks a + 5/6 sweep as parity. + +--- + +## 2. The numbers + +### Speed against mimalloc (ratio = rusty_alloc / mimalloc; below 1 means rusty_alloc is faster) + +| workload | mimalloc | rusty_alloc | ratio | rusty faster | +|---|---:|---:|---:|---:| +| 5,900 × 224 B kept, then freed | 0.245 ms | 0.228 ms | 0.931 | 4/5 | +| 5,900 × 11.2 KB kept, then freed | 10.6 ms | 10.8 ms | 1.017 | 2/5 | +| fresh 1 MB × 50 | 2.47 ms | 2.51 ms | 1.016 | 2/5 | +| fresh 8 MB × 20 | 8.51 ms | 8.37 ms | 0.983 | 4/5 | +| Vec growth by push to 8 MB × 10 | 10.3 ms | 10.5 ms | 1.020 | 1/5 | +| cross-thread free, 24 × 20k × 224 B | 17.4 ms | 12.6 ms | **0.725** | 5/5 | +| cross-thread free, 24 × 500 × 64 KB | 18.6 ms | 18.7 ms | 1.004 | 3/5 | +| 24-thread churn, 64 B | 70.0 ms | 70.9 ms | 1.012 | 3/5 | +| 24-thread churn, 4 KB | 45.1 ms | 34.9 ms | **0.774** | 5/5 | +| fresh 16/30 MB alternating (below a segment) | 12.8 ms | 10.9 ms | **0.846** | 6/6 | +| **realloc step 8 → 16 MB** | 0.726 ms | 0.628 ms | 0.865 | 6/6 | +| **realloc step 16 → 32 MB** | 1.578 ms | 1.466 ms | 0.929 | 5/6 | +| **realloc step 33 → 66 MB** | 4.552 ms | 6.405 ms | **1.407** | **0/6** | +| **realloc step 64 → 128 MB** | 8.489 ms | 10.466 ms | **1.233** | **0/6** | +| **Vec growth by push to 64 MB × 3** | 30.2 ms | 37.2 ms | **1.231** | **0/6** | +| fresh huge 33-128 MB, per buffer | 2.06-8.83 ms | 2.14-9.08 ms | 1.01-1.04 | 1-2/6 | + +Against the Windows system heap, rusty_alloc wins every workload above, from +0.05× to 0.67×. For a Windows consumer that is the headline, and it is why +`rusty_esp_sense` ships it. + +### Memory (working set from `K32GetProcessMemoryInfo`) + +| probe | system | mimalloc | rusty_alloc | +|---|---:|---:|---:| +| 12 × 38 MB live | 460 MB | 461 MB | 461 MB | +| …all freed | **4 MB** | 461 MB | 461 MB | +| …500 ms later | 4 MB | 461 MB | 462 MB | +| then 45 MB of 224 B blocks live | 54 MB | 491 MB | 494 MB | + +--- + +## 3. Finding 1: realloc that MOVES a huge block is 1.23-1.41× mimalloc + +**What is established:** + +- It is specific to growing a block that is **already huge**, larger than a + 32 MiB segment. The same step entirely below the segment size is faster + than mimalloc (8 → 16 MB 0.865×, 16 → 32 MB 0.929×, 6/6 and 5/6). +- It is not the policy. `alloc.rs::realloc` keeps a block in place only + when `newsize <= usable && newsize >= usable / 2`, and otherwise mallocs, + copies and frees. That is upstream's generic shape too. + +**Ruled out**, each with its own single-variable probe at 6 pairs: + +1. **Fresh huge allocation is not the cost.** Fresh 33, 38, 64 and 128 MB + blocks, written and freed, run 1.01-1.04× (1-2/6): near parity, at most a + few percent. +2. **Reuse of freed huge space across sizes is not the cost.** Fresh blocks + alternating 33/66 MB run 1.013× (2/6), against 0.996× for one size + repeated. +3. **Several live huge blocks freed together is not the cost.** Two live + (33 + 66 MB) run 0.964× (4/6), and four live 0.979× (4/6). That is a + realloc's footprint without the realloc, and it runs at parity. + +So the gap lives inside `realloc`'s own moving path for a huge block. + +**Candidates, in the order we would test them:** + +- **A. The copy itself.** The move is `copy_nonoverlapping(p, np, usable.min(newsize))` + over 33-64 MB, which on Windows is the MSVC runtime's `memcpy`. Upstream + copies through `_mi_memcpy`. Time the two copies alone at 33 MB and 64 MB + into a freshly committed destination. If rusty's copy is slower there, the + fix is a copy strategy chosen by size: `rep movsb` where the CPU has ERMS + or FSRM, and no non-temporal stores into a destination that is about to be + written again. +- **B. How much is copied.** `usable.min(newsize)` copies the whole + *usable* size of the old block. If a huge block's usable size is rounded + well past what was requested (to a slice or segment granularity), the + copy moves more bytes than the caller ever wrote. Compare + `usable_size(p)` with the requested size for 33 MB and 64 MB blocks, and + compare with upstream's `mi_usable_size`. +- **C. Growing a huge block where it stands.** If the huge segment's + reservation, or the address space right after it, has room, a huge block + can grow by committing more pages instead of moving. That removes the copy + and the fresh destination's page faults together. Check whether upstream + 2.2.x does anything of the kind for huge pages on Windows before deciding + it is a feature gap rather than a defect. +- **D. The huge-block paths realloc takes on the way.** `usable_size` takes + `usable_size_slow` for huge pages, and `free_inline` frees a huge segment. + Both are cheap in isolation (probe 3 frees huge blocks at parity), but + count them on your instrument inside `realloc` for completeness. + +**Why it matters to consumers:** a `Vec` that grows past 32 MiB by `push` +(buffered file reads, collecting a large result) crosses exactly this path +once per doubling above the segment size. That is 1.23×, 0/6, measured. + +--- + +## 4. Finding 2: 251 start-up allocations re-enter the global allocator + +On the first allocation of a process, rusty_alloc makes **251 allocations +through the global allocator** before returning. mimalloc and the system +heap make **none**. The same probe, behind the same counting wrapper, reads +261 against 10. In `rusty_esp_sense` this showed up as a constant +251 +allocations (+9 KB) in every command's census, `run` included. + +**Mechanism** (`crates/rusty_alloc/src/options.rs`, the `std` environment +pass, around lines 352-356): + +```rust +for i in 0..OPTION_COUNT { // 38 options + let name = OPTION_NAMES[i].to_uppercase(); // a String + let val = std::env::var(std::format!("RUSTY_ALLOC_{name}")) // a String + env lookup + .or_else(|_| std::env::var(std::format!("MIMALLOC_{name}"))) // another pair + ... +``` + +That is 38 options × about 6.6 allocations each: the uppercase name, two +formatted keys, and two `std::env::var` calls. On Windows each call converts +the key to UTF-16 and the value back, which allocates too. The total is 251. + +**Why it is worth fixing, beyond the count:** + +- It is allocator re-entrancy during initialisation. Every one of those + allocations lands in the heap that is still being set up. +- It is a start-up cost paid by every process, including the short CLI runs + that are most of a command-line tool's life. +- You already deleted this same pass on `no_std` and on + `wasm32-unknown-unknown`, for size. This is the same problem on hosted + targets, for time and re-entrancy. + +**Fixes, cheapest first:** + +1. **Precompute the uppercase names** as a `const` table beside + `OPTION_NAMES`, and build each key in a stack buffer with no `format!`. + That removes about three of the six or seven allocations per option. +2. **Read the environment once, not 76 times.** Walk the environment block + a single time (on Windows `GetEnvironmentStringsW`, which the `windows` + primitives can already reach) and match each entry against the two + prefixes. Parse only the entries that match, usually none. That takes + the pass from 76 lookups to one walk, and from about 251 allocations to + zero. +3. **Or make the pass lazy.** Only the options actually read on the hot + path need the environment at first allocation; the rest can resolve on + their first `get`. + +The deterministic check: the counting-wrapper probe should read 10 at start-up, +the same as mimalloc. + +--- + +## 5. Two memory notes (shared with upstream, not defects against it) + +- **Freed memory is not returned, by design.** `purge_delay` defaults to -1 + (purging is opt-in). After 456 MB of huge blocks are freed, the working + set stays at 461 MB, and at 462 MB 500 ms later. mimalloc behaves the same + on this box. The system heap returns to 4 MB. In `rusty_esp_sense` the + peak working set rose 25-40 %: 115 → 144 MB single-threaded, 509 → 717 MB + for the raw-window run at 24 threads. That is a fair trade, and the + consumer ships it behind a feature flag, but a short "memory will look + larger" line in the README would save the next adopter a surprise. +- **Freed huge segments are not recycled for small objects.** After those + 456 MB are freed, 45 MB of 224 B blocks raise the working set to 494 MB, + where the freed space could have held them. mimalloc does the same (491 MB) + so this is not a regression against upstream. It is the obvious next step + if the team ever wants to beat upstream on footprint as well as speed: + carve small-object segments out of retained huge ones. + +--- + +## 6. Where you win, for the record + +- **Cross-thread free of small blocks: 0.725× mimalloc, 5/5.** This is + rayon's collect-then-drop pattern: workers allocate and the main thread + frees. It is the pattern a data-parallel pipeline hits most. +- **24-thread churn of 4 KB blocks: 0.774×, 5/5.** +- **Repeated fresh blocks below a segment: 0.81-0.85×, 6/6.** +- **Against the Windows system heap: 0.05-0.67× on every workload**, and + 7.5 % off a whole candle + rayon benchmark end to end. + +--- + +## 7. What we would do first + +1. **§4, the options pass.** It is small, deterministic to verify (start-up + allocations 261 → 10) and removes allocator re-entrancy during + initialisation. +2. **§3, candidates A and B**, on the deterministic instrument: price the + huge copy and the bytes it moves. Only if both come back at parity, look + at C, growing huge blocks in place. +3. **§5**, a README line, and a backlog entry for recycling retained huge + segments. + +--- + +## 8. Executed (2026-09-24) + +Both fixes were built against the tree at `c9631f4` and measured on this +report's own probe (`F:/janus-data/raprobe`, copied to scratch twice and +patched with `[patch.crates-io]` to link a worktree of that commit and the +fixed tree; a third copy links mimalloc 0.1.52). The full record, with the +method line and every raw per-round value, is the LEDGER entry of the same +date; this section is the report's own questions, answered in its own order. + +### §3 — it was candidate B + +- **A, the copy itself: no.** Both sides call the platform `memcpy`; nothing + about the copy changed and nothing needed to. +- **B, how much is copied: yes, and it was twice what the caller wrote.** + `segment::huge_alloc` reserves in whole 32 MiB chunks through the arena — + a 33 MB request holds a 64 MiB chunk pair, a 64 MB one holds 96 MiB — and + then set the page's `block_size` to that whole reservation minus the + header. `usable_size(p)` is the length `realloc` copies when it moves, so + growing 33 MB copied and first-touched 64 MiB on both sides, and growing + 64 MB copied 96 MiB. The report's arithmetic already fit that shape: the + two steps below the segment size have no such slack and were faster than + mimalloc. The page now reports `align_up(size, SEGMENT_SLICE_SIZE)` + capped at the reservation — upstream's `psize`, and what `mi_usable_size` + returns there. The reservation itself is unchanged. `zalloc` on a + recycled chunk zeroed the same extent and is fixed by the same line. +- **C, growing in place: not built, recorded.** The fat usable size *was* an + in-place grow for anything that fit inside the slack; the fix removes it, + as upstream never had it. Keeping it deliberately costs a flags load and a + branch on every moving `realloc` (the whole of the deterministic `realloc` + op) for a sub-2x grow of a block already above 32 MiB, which the doublings + a `Vec` performs never are. `docs/opps.md` #10 has the hook and the + arithmetic. +- **D, the paths on the way: no.** `usable_size_slow` and `free_inline` on + a huge block are unchanged; the report's probe 3 had already priced them + at parity. + +Deterministic check first (`tests/alloc_core.rs::huge_usable_size_is_the_request_not_the_reservation`): +usable of a 33 MiB block was 67,043,328 bytes (64 MiB − 64 KiB) and is now +within one slice of 34,603,008; a 64 MiB block reported 96 MiB − 64 KiB and +now reports 64 MiB. Static instruction counts from the emitted x86-64 assembly: +`realloc`, `usable_size`, `free` and `page_extend` byte-for-byte the same +length (163 / 17 / 66 / 42); `huge_alloc` 199 → 203, cold. + +Then the clock, on this probe, pinned to one core at High priority, whole +processes ABBA-alternated with the leading arm swapped each round, median of +the per-run bests, paired wins, z. The box was at 62–76 % load from another +process, so a null arm (one binary in both arms, 6 rounds) set the floor: +median ratios 0.89–1.03, no |z| ≥ 2. + +| workload | 2.2.0 tree | fixed | ratio | wins | z | +|---|---:|---:|---:|---:|---:| +| realloc step 33 → 66 MB | 7.707 ms | **5.243 ms** | **0.680** | **8/8** | +2.83 | +| realloc step 64 → 128 MB | 13.237 ms | **10.152 ms** | **0.767** | **8/8** | +2.83 | +| Vec growth by push to 64 MB × 3 | 45.201 ms | **36.673 ms** | **0.811** | **6/6** | +2.45 | +| realloc step 8 → 16 / 16 → 32 MB | | | 0.975 / 0.923 | 5/8, 6/8 | floor | +| fresh 16–128 MB, per buffer | | | 0.97–1.06 | 1–4/6 | floor | + +And against mimalloc, which is what §2 asked: + +| workload | §2 (before) | now | wins now | z | +|---|---:|---:|---:|---:| +| realloc step 33 → 66 MB | 1.407, 0/6 | **1.013** | 5/8 | +0.71 (parity) | +| realloc step 64 → 128 MB | 1.233, 0/6 | **0.969** | 7/8 | +2.12 (faster) | +| Vec growth by push to 64 MB × 3 | 1.231, 0/6 | **1.015** | 3/6 | 0.00 (parity) | +| fresh 30–64 MB, per buffer | 1.01–1.04 | 1.02–1.06 | 0–3/6 | unchanged: the fix does not touch this path (tree vs tree 3/6) | + +### §4 — zero allocations, the same 76 lookups + +Fixes 1 and 2 from the list, combined and without the single environment +walk: the key is built by hand in a stack buffer whose size is a `const` over +the table (`RUSTY_ALLOC_` + the longest name + NUL), the value lands in a +64-byte stack buffer through a new `prim::getenv` — `libc::getenv` on unix and +`GetEnvironmentVariableA` on Windows, the two calls upstream's own prim makes +— and the value grammar is parsed on those bytes in place. One lookup per +prefix per option as before, 76 in all, and none of them owns memory. The +Windows API converts the name to UTF-16 on the process heap, which a +counting wrapper on the global allocator does not and should not see. +wasm32-unknown-unknown keeps the pass compiled out (its size ratchet is +unmoved by construction); Miri and wasm32-wasip1 keep a `std::env` fallback. + +The deterministic check this section asked for, on this probe's counting +wrapper: **`startup` read 263 on 2.2.0 and reads 12 now; mimalloc reads 12.** +Two tests keep it: `tests/options_env.rs` sets both prefixes, a precedence +conflict, `YES` and a KiB size in a child process and reads them back through +`options::get`; `rusty_alloc_api/tests/reentrancy.rs` wraps `RustyAlloc` in a +depth-counting `GlobalAlloc` and fails if the allocator ever allocates through +the global allocator while serving a request (it read 0 of 395 calls; it +would have read 251). + +### §5 — the README line, and what the backlog entry says + +The README's Features section has a *Memory* paragraph: freed memory stays +committed by default (`purge_delay` = -1, as upstream ships), the working set +reads near its past peak, and the two environment variables or +`options::set(15, …)` that turn purging on. This probe's `retain` reads the +same before and after — 461 MB retained, 492 MB with the 224 B blocks live — +because nothing here touched retention. + +The second note is backlog `docs/opps.md` #11, with one correction to the +report's framing: the freed huge chunks DO come back through the arena bitmap +and a fresh small-object segment takes one, so a recycler is not what is +missing. What raises the working set is first-touch of the pages the huge +block never wrote (a 38 MB block leaves 26 MB of its 64 MiB pair untouched). +Preferring the touched prefix when carving is the lever, and its instrument +is this probe's working-set number, not an instruction count. + +### Gates + +`cargo test -p rusty_alloc` 144/0 at default features, plus `debug_checks` +and `secure`; the `rusty_alloc-api` suite with the new re-entrancy test; +clippy clean on the new code; `cargo fmt --check`; `tools/unsafe-census.sh +--update` (928 → 931: one FFI block per prim backend, one `set_var` in a +test, each rowed in `UNSAFE.md`). Not run here: callgrind (no Linux box) — +the icount farm re-reads the `realloc` and `huge` opscan ops, where the +static counts predict 0 and +4. diff --git a/tools/unsafe-baseline.txt b/tools/unsafe-baseline.txt index c57726a..0aa1e91 100644 --- a/tools/unsafe-baseline.txt +++ b/tools/unsafe-baseline.txt @@ -1,23 +1,23 @@ - 94 crates/rusty_alloc/src/alloc.rs + 106 crates/rusty_alloc/src/alloc.rs 15 crates/rusty_alloc/src/arena.rs - 73 crates/rusty_alloc/src/heap.rs + 77 crates/rusty_alloc/src/heap.rs 42 crates/rusty_alloc/src/init.rs 2 crates/rusty_alloc/src/lib.rs - 6 crates/rusty_alloc/src/options.rs + 17 crates/rusty_alloc/src/options.rs 12 crates/rusty_alloc/src/os.rs 38 crates/rusty_alloc/src/page.rs 37 crates/rusty_alloc/src/prim/fixed.rs 8 crates/rusty_alloc/src/prim/mock.rs 17 crates/rusty_alloc/src/prim/mod.rs - 28 crates/rusty_alloc/src/prim/unix.rs + 31 crates/rusty_alloc/src/prim/unix.rs 6 crates/rusty_alloc/src/prim/wasm.rs - 33 crates/rusty_alloc/src/prim/windows.rs + 34 crates/rusty_alloc/src/prim/windows.rs 2 crates/rusty_alloc/src/random.rs 36 crates/rusty_alloc/src/segment.rs 3 crates/rusty_alloc/src/stats.rs - 14 crates/rusty_alloc_api/src/lib.rs + 16 crates/rusty_alloc_api/src/lib.rs 15 crates/rusty_alloc_bench/src/kernels.rs 14 crates/rusty_alloc_bench/src/replay.rs - 356 crates/rusty_alloc_ffi/src/lib.rs + 358 crates/rusty_alloc_ffi/src/lib.rs 51 crates/rusty_alloc_override/src/lib.rs 26 crates/rusty_alloc_wasm/src/lib.rs