diff --git a/Cargo.lock b/Cargo.lock index 2ea21dc46..a5c8c2829 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -738,9 +738,12 @@ checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "constant_time_eq" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a1ec0cfec728a79a5109075543131387f911cb4d07716436d7ae20533657a96" +checksum = "6187e670c346a04bcbf5def0393d57ec0e5ab56565cde6be4a7cbdb6cdc2f3f6" +dependencies = [ + "rustversion", +] [[package]] name = "core-foundation" @@ -775,9 +778,9 @@ dependencies = [ [[package]] name = "cranelift" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c8702ad42c0aac8d585f1c3ffe8039bcd996898615c8948a1943e0c9661232" +checksum = "4a9ea11e186263f9021825558839b756e8dcb74b63f8f5bb0335b1f93d6ef6d5" dependencies = [ "cranelift-codegen", "cranelift-frontend", @@ -786,27 +789,27 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d521bdbc6098937af83ef4ab6d5c07398126bc71878f7ef4ea9499977978ef5" +checksum = "9903e767cc0a95a59950de099a6b1d61e1476f774be1cdfa06d7ccdc9bfae56f" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dde0b83164d4a497860af4236271178bc640512b067101e0853e4f74eaa4df5" +checksum = "e777252ea3ec9daffa71408fbfe0793ab0a7b7bc3b2cf0f417dd0fa33964b8ef" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0111d110b72b4efad69a372e29e21628652fd0bcab66967e5c8350ab679affd5" +checksum = "7828208a36e6627481cea61bd24c6234e31411d5c58b48e80ca094a1d593b944" dependencies = [ "cranelift-entity", "wasmtime-internal-core", @@ -814,18 +817,18 @@ dependencies = [ [[package]] name = "cranelift-bitset" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf01ecc92fc5499789d79c3b817299d5a8ddd828d31dcf0f9cc3cc66f38dbb36" +checksum = "a58c8447cc59ef98c49096679f81392ad0acec2224cea2bef52011f5169f9d02" dependencies = [ "wasmtime-internal-core", ] [[package]] name = "cranelift-codegen" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cd2563bead0090c3879a7ff7327f7550c9d59bb5d05ecc8cd7886977aa3125a" +checksum = "ce520e899df1de583e7b564eafd66760fbc147d72894d2278ddac57a1489fcc0" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -850,9 +853,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9640d250d26f9381a73dc7f9862b27928d4809119aec73be0e556612e67b6a99" +checksum = "8d8ab23e63d78ea6bbda18ae1ed9c958bc1cb88d90fb5e95f5ba62e9c019474b" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -862,24 +865,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07f156b90efc94371ddb3536f76e4ab671ad2e093bfa5511e10198cadbb0c47" +checksum = "24319a996b1ef40ebf8af69b39c868c790b35a42cfe38edacfd8c9deb75ea712" [[package]] name = "cranelift-control" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a76fd9dd37dcbc3d2d2e00abe3281a7e88adc035fba3b8114cc69981576ec" +checksum = "cf9856d68cc2cefb83229cb2c55b620dd38427555c2fe87d73f8a4421616f628" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eea22522144ba08c7e7ef94bfc25d474ef016c2771974b8ab1986734ac85965" +checksum = "e0ec225d6b79c5d61358cb5ea081a1384ec541dbf8c1a8c618d187875af326ad" dependencies = [ "cranelift-bitset", "wasmtime-internal-core", @@ -887,11 +890,12 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa2826c80dff1d93b19b3cfbcaf9fae44c78d739a98d146dd5bd89c51e14367" +checksum = "7d3a96a09bd9bd3cf6df2de2ea15d7418f493e946a8eaa1acfe39297a67ed3f3" dependencies = [ "cranelift-codegen", + "hashbrown 0.17.1", "log", "smallvec", "target-lexicon", @@ -899,15 +903,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e238a69b95c5415456f22189494a12db94f313bb72b6ec9cc88ddf2f1056e28e" +checksum = "bd28f593c36afbdc9aa17305c0bb66c39ce0530e1caffcf389fbec053950083e" [[package]] name = "cranelift-jit" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7def01f2b14f97421558d1db33e396b97b97ab2ed40dedc8165ba00d13088e6" +checksum = "d3e00ac7d32a2662e3685ac3161b9d62050c8cef05f0618eef28cba8e19e808d" dependencies = [ "anyhow", "cranelift-codegen", @@ -917,7 +921,7 @@ dependencies = [ "cranelift-native", "libc", "log", - "memmap2 0.2.3", + "memmap2", "region", "target-lexicon", "wasmtime-internal-jit-icache-coherence", @@ -926,9 +930,9 @@ dependencies = [ [[package]] name = "cranelift-module" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985df7eceefc91cb75bf7f51b32b7f1739d0fc0e25ddf023b1de407cb3c93d77" +checksum = "89471cd942ab4d966b8c08a258a44042d98a9151dab90128da794e0ceb057927" dependencies = [ "anyhow", "cranelift-codegen", @@ -937,9 +941,9 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eceb0ebd8d6aef6bb287e8d532a164b0db1c0062961211e9c22a91f67521c098" +checksum = "2987ca47affc261aa31ac643fb80dd7f8274cebf878003ba9f50cd6ff2c1055f" dependencies = [ "cranelift-codegen", "libc", @@ -948,9 +952,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.132.3" +version = "0.135.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004643f39a7bec553de5263d650db30e5b9caec1d5cbe065fd732b7ec9ae40d0" +checksum = "b7431dd8c9def94aca43b27915dee0d42103d9b13922cfb044febcd975547d68" [[package]] name = "crc32fast" @@ -1176,14 +1180,14 @@ dependencies = [ [[package]] name = "dns-lookup" -version = "3.0.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d" +checksum = "6120e7e5dcd1c90098e349def389e2797377cdbe6b465ad8fdd115c0c99d5cf2" dependencies = [ "cfg-if", "libc", "socket2", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2227,15 +2231,6 @@ version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" -[[package]] -name = "memmap2" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" -dependencies = [ - "libc", -] - [[package]] name = "memmap2" version = "0.9.11" @@ -3055,9 +3050,9 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de2c52737737f8609e94f975dee22854a2d5c125772d4b1cf292120f4d45c186" +checksum = "757712e8e61590d6d4f5d563483755538b5aa13467837a3b41cd9832509a7f85" dependencies = [ "allocator-api2", "bumpalo", @@ -3456,7 +3451,7 @@ dependencies = [ "libloading 0.9.0", "mac_address", "memchr", - "memmap2 0.9.11", + "memmap2", "nix 0.31.3", "num-traits", "num_cpus", @@ -3597,7 +3592,7 @@ version = "0.5.0" dependencies = [ "adler32", "ascii", - "constant_time_eq 0.5.0", + "constant_time_eq 0.6.0", "crossbeam-utils", "csv-core", "der", @@ -3677,7 +3672,7 @@ dependencies = [ "ascii", "bitflags 2.13.1", "bstr", - "constant_time_eq 0.5.0", + "constant_time_eq 0.6.0", "crossbeam-utils", "exitcode", "flame", @@ -4621,9 +4616,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-core" -version = "45.0.3" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3073c03f97f871fe6400e68621c863b93ba79296f8e570285231952d23fcc804" +checksum = "821385794cf44baf2967fd2515368429ed2bff9b9b256f62d09a0f1301474fd8" dependencies = [ "hashbrown 0.17.1", "libm", @@ -4631,11 +4626,10 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "45.0.3" +version = "48.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37dee05e8c35759826f6b926cd949c51f771b6a58619d8e60c63c3f3d3e5e59b" +checksum = "3cce25afd9e7ac4957292a5c6a219951dd0f140b8417e7378a97f50b67c3b96f" dependencies = [ - "cfg-if", "libc", "wasmtime-internal-core", "windows-sys 0.61.2", @@ -4737,16 +4731,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -4764,31 +4749,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[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 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "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]] @@ -4797,96 +4765,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[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.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "1.0.3" diff --git a/Cargo.toml b/Cargo.toml index 01f284e4e..3ff3029d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -202,15 +202,15 @@ bitflagset = "0.0.3" bstr = { version = "1", default-features = false, features = ["unicode"] } bzip2 = "0.6" console_error_panic_hook = "0.1" -constant_time_eq = "0.5" -cranelift = "0.132.0" -cranelift-jit = "0.132.0" -cranelift-module = "0.132.0" +constant_time_eq = "0.6" +cranelift = "0.135.0" +cranelift-jit = "0.135.0" +cranelift-module = "0.135.0" crc32fast = "1.3.2" criterion = { package = "codspeed-criterion-compat", version = "5.0.1", features = ["html_reports"] } crossbeam-utils = "0.8.21" csv-core = "0.1.11" -dns-lookup = "3.0" +dns-lookup = "4.0" exitcode = "1.1.2" flame = "0.2.2" flamer = "0.5" diff --git a/crates/jit/src/instructions.rs b/crates/jit/src/instructions.rs index a3c4ca800..499d7c8ba 100644 --- a/crates/jit/src/instructions.rs +++ b/crates/jit/src/instructions.rs @@ -429,7 +429,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { ) => { // Shifts throw an exception if we have a negative shift count // Remove all bits except the sign bit, and trap if its 1 (i.e. negative). - let sign = self.builder.ins().ushr_imm(b, 63); + let sign = self.builder.ins().ushr_imm_u(b, 63); self.builder.ins().trapnz( sign, TrapCode::user(CustomTrapCode::NegativeShiftCount as u8).unwrap(), @@ -800,7 +800,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { JitValue::Bool(val) => val, _ => return Err(JitCompileError::BadBytecode), }; - let not_boolean = self.builder.ins().bxor_imm(boolean, 1); + let not_boolean = self.builder.ins().bxor_imm_u(boolean, 1); self.stack.push(JitValue::Bool(not_boolean)); Ok(()) } @@ -1041,10 +1041,13 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let need_nan = self.builder.ins().bor(cmp_le, cmp_nan); // (B) Reinterpret the bits of x as an integer. - let bits = self.builder.ins().bitcast(types::I64, MemFlags::new(), x); + let bits = self + .builder + .ins() + .bitcast(types::I64, MemFlagsData::new(), x); // (C) Extract the exponent (top 11 bits) from the bit representation. - let shift_52 = self.builder.ins().ushr_imm(bits, 52); + let shift_52 = self.builder.ins().ushr_imm_u(bits, 52); let exponent_mask = self.builder.ins().iconst(types::I64, 0x7FF); let exponent = self.builder.ins().band(shift_52, exponent_mask); @@ -1058,7 +1061,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { // (E) For normal numbers (exponent ≠ 0), add the implicit leading 1. let implicit_one = self.builder.ins().iconst(types::I64, 1 << 52); - let zero_exp = self.builder.ins().icmp_imm(IntCC::Equal, exponent, 0); + let zero_exp = self.builder.ins().icmp_imm_u(IntCC::Equal, exponent, 0); let frac_one_bor = self.builder.ins().bor(fraction_part, implicit_one); let fraction_with_leading_one = self.builder.ins().select( zero_exp, @@ -1072,7 +1075,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let m = self .builder .ins() - .bitcast(types::F64, MemFlags::new(), fraction_bits); + .bitcast(types::F64, MemFlagsData::new(), fraction_bits); // (G) Compute ln(m) using the series ln(1+f) with f = m - 1. let one_f64 = self.builder.ins().f64const(1.0); @@ -1161,7 +1164,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let two_to_k = self .builder .ins() - .bitcast(types::F64, MemFlags::new(), shifted); + .bitcast(types::F64, MemFlagsData::new(), shifted); let result = self.dd_scale(sum, two_to_k); // (C) If overflow was detected, return infinity; otherwise, return the computed value. @@ -1478,14 +1481,14 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { let base_phi = params[2]; // If exponent is odd, multiply result by base - let is_odd = self.builder.ins().band_imm(exp_phi, 1); - let is_odd = self.builder.ins().icmp_imm(IntCC::Equal, is_odd, 1); + let is_odd = self.builder.ins().band_imm_u(exp_phi, 1); + let is_odd = self.builder.ins().icmp_imm_u(IntCC::Equal, is_odd, 1); let mul_result = self.builder.ins().imul(result_phi, base_phi); let new_result = self.builder.ins().select(is_odd, mul_result, result_phi); // Square the base and divide exponent by 2 let squared_base = self.builder.ins().imul(base_phi, base_phi); - let new_exp = self.builder.ins().sshr_imm(exp_phi, 1); + let new_exp = self.builder.ins().sshr_imm_u(exp_phi, 1); self.builder.ins().jump( loop_block, &[new_exp.into(), new_result.into(), squared_base.into()], diff --git a/crates/jit/src/lib.rs b/crates/jit/src/lib.rs index 0c700e93c..955f4dc64 100644 --- a/crates/jit/src/lib.rs +++ b/crates/jit/src/lib.rs @@ -97,7 +97,7 @@ impl Jit { }; builder.seal_all_blocks(); - builder.finalize(); + builder.finalize(self.module.target_config()); self.module.define_function(id, &mut self.ctx)?; diff --git a/crates/vm/src/gc_state.rs b/crates/vm/src/gc_state.rs index 3a3440fb5..1016a3e4a 100644 --- a/crates/vm/src/gc_state.rs +++ b/crates/vm/src/gc_state.rs @@ -361,7 +361,7 @@ impl GcState { /// stays correct, rather than aliasing a live interpreter. fn alloc_owner(&self) -> GcOwner { self.next_owner - .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |next| { + .try_update(Ordering::Relaxed, Ordering::Relaxed, |next| { next.checked_add(1) }) .unwrap_or(GC_NO_OWNER) @@ -1172,7 +1172,7 @@ impl GcState { unsafe { ptr.as_ref().set_gc_generation(2) }; count += 1; } - let _ = self.permanent_count.fetch_update( + let _ = self.permanent_count.try_update( Ordering::Relaxed, Ordering::Relaxed, |permanent| Some(permanent.saturating_sub(count)),