Skip to content

fix(turbo-tasks): let parking_lot block on wasm instead of panicking - #97860

Open
sokra wants to merge 1 commit into
codex/turbopack-wasm/wasm-test-hostfrom
codex/turbopack-wasm/parking-lot-atomics
Open

fix(turbo-tasks): let parking_lot block on wasm instead of panicking#97860
sokra wants to merge 1 commit into
codex/turbopack-wasm/wasm-test-hostfrom
codex/turbopack-wasm/parking-lot-atomics

Conversation

@sokra

@sokra sokra commented Aug 25, 2026

Copy link
Copy Markdown
Member

What?

Makes parking_lot locks actually block on wasm instead of panicking, and removes 33 of the 35
ignores that panic had forced onto the wasm test suites.

Why?

parking_lot_core picks its thread parker in thread_parker/mod.rs. The working wasm parker
(wasm_atomic.rs, built on memory_atomic_wait32 / memory_atomic_notify) is selected only under

all(feature = "nightly", target_family = "wasm", target_feature = "atomics")

Otherwise it falls back to wasm.rs, whose park() is
panic!("Parking not supported on this platform"). wasm32-wasip1-threads does report
target_feature = "atomics", so the only missing piece was the feature — every contended lock
panicked, which is why so many tests were ignored on wasm.

How?

Two changes, and neither alone is sufficient:

  • bump parking_lot_core 0.9.8 → 0.9.12, because 0.9.8's atomic parker needs feature(stdsimd),
    removed from Rust long ago;
  • enable parking_lot's nightly feature for wasm targets only (it forwards to
    parking_lot_core/nightly). 0.9.12 still gates the atomic parker behind it, so a bump on its own
    keeps selecting the panicking stub silently.

Verified on the resolved feature graph rather than the manifest — nightly is present for
wasm32-wasip1-threads and absent for the host.

Testing

contended_mutex_blocks_and_hands_over is built so it cannot pass vacuously: a barrier guarantees the
waiter actually contends, the waiter must block for a measurable interval, and it must observe the
holder's write. Negative control: with the feature removed it fails at
parking_lot_core-0.9.12/src/thread_parker/wasm.rs:26 with "Parking not supported on this platform".

turbo-tasks          54 pass / 28 ignored  ->  72 pass / 11 ignored
turbo-tasks-backend  66 pass / 32 ignored  ->  82 pass / 15 ignored
native                     0 ignored, unchanged

Two of the old ignores remain, under a different and verified cause: their work completes in ~500 ms
of an 800 ms serial sum, so the parallelism is real, but dropping a multi-thread tokio runtime while
their blocking helpers are still alive deadlocks on wasm. That was previously hidden because
panic = abort killed the process at the failing assertion before teardown ran. It is fixed in the
follow-up runtime layer.

Also fixes a latent bug unrelated to wasm: test_parallel_try_for_each_mut asserted every element was
incremented, which only holds when the chunk size is 1. Chunking comes from
available_parallelism() * 4 and each chunk stops at its first error, so with parallelism 1 the chunk
size is 2 and every second item is skipped — it would fail on any single-core machine. It now asserts
the parallelism-independent contract.

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Tests Passed

Commit: c58ce2a

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 3 regressions

Metric Canary PR Change Trend
Turbo Build Time 5.808s 6.259s 🔴 +451ms (+8%) █▆▂▅▁
Turbo Build Time (cached) 2.898s 3.123s 🔴 +225ms (+8%) █▇▂▄▂
Webpack Build Time (cached) 23.699s 24.421s 🔴 +722ms (+3%) ▁▁▂▁▂
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 814ms 814ms █████
Cold (Ready in log) 803ms 814ms ▇█▆▇▃
Cold (First Request) 1.287s 1.316s ▇█▅▆▁
Warm (Listen) 813ms 814ms █████
Warm (Ready in log) 801ms 807ms ▆█▆▅▄
Warm (First Request) 1.269s 1.291s ▄█▄▂▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 812ms 812ms ▁▁▁▁▁
Cold (Ready in log) 791ms 793ms ▁▁▁▁▁
Cold (First Request) 3.256s 3.295s ▁▁▂▁▂
Warm (Listen) 813ms 812ms ▁▁▁▁▂
Warm (Ready in log) 789ms 794ms ▁▁▁▁▂
Warm (First Request) 3.317s 3.361s ▁▁▁▁▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.808s 6.259s 🔴 +451ms (+8%) █▆▂▅▁
Cached Build 2.898s 3.123s 🔴 +225ms (+8%) █▇▂▄▂
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 23.910s 24.133s ▁▁▂▁▂
Cached Build 23.699s 24.421s 🔴 +722ms (+3%) ▁▁▂▁▂
node_modules Size 557 MB 557 MB ▁▁███
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
017_4moyv5m34.js gzip 117 B 117 B
05jocc85-b73_.js gzip 341 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0e5lgz-xcf6ln.js gzip 273 B 273 B
0enhddgqs2dl-.js gzip 265 B 265 B
0h34mejwa_7pd.js gzip 354 B 354 B
0w853zxni3ro0.js gzip 1.36 kB N/A -
13lq2aw3_0bgw.js gzip 3.52 kB N/A -
19ll0d77yn0fq.js gzip 71.5 kB N/A -
1drifx6-oqf3q.js gzip 5.7 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1m5vdnlf0deiv.js gzip 411 B 411 B
1nigpy_mr0xvj.js gzip 339 B N/A -
1p0l8mn2wz5f2.js gzip 1.97 kB N/A -
1ph_nbsm967ot.js gzip 152 B N/A -
1sqoyy39jpgkq.js gzip 121 B 121 B
1tf1phijqlx9j.js gzip 220 B 220 B
2-54v5vj7orwp.js gzip 46.8 kB N/A -
2b05_424u1zq-.js gzip 120 B N/A -
2ca40xittx95r.js gzip 8.75 kB N/A -
2kci0vnt-49o-.js gzip 113 B 113 B
2rtriq9lc6zj-.js gzip 116 B N/A -
2sxgl_rcrrn_p.js gzip 399 B N/A -
2vt62i17bhbdu.js gzip 2.35 kB N/A -
33ykhou7tl-4h.js gzip 7.53 kB N/A -
342di-crrg9kq.js gzip 119 B N/A -
36hfc2_979aw2.js gzip 119 B N/A -
38wfp6jjrrdfm.js gzip 131 B 131 B
3dl1ilk37-30g.js gzip 117 B N/A -
3h0us7yy7bd_o.js gzip 13.1 kB N/A -
3kvxagoobts7h.js gzip 117 B N/A -
3p99hd9vwe6ae.js gzip 13 kB N/A -
3r0475panhk6m.js gzip 123 B N/A -
3s0i-weykgzrt.js gzip 125 B N/A -
3vjosdbddykpw.js gzip 5.88 kB N/A -
3wijk2ywqgsv9.js gzip 2.52 kB N/A -
3xuguv9lsoqw7.js gzip 65.5 kB N/A -
41u5s3oe2-erp.js gzip 2.29 kB N/A -
turbopack-0d..9ejy.js gzip 3.74 kB 3.74 kB
02zc7sqlpqxn3.js gzip N/A 119 B -
06pzxqp5qiozm.js gzip N/A 5.7 kB -
0dw-iyxdctoxo.js gzip N/A 65.5 kB -
0e28eh3gbwmp0.js gzip N/A 3.51 kB -
0e5ldm8_fmypq.js gzip N/A 71.5 kB -
0jwho9fkrb_t3.js gzip N/A 2.29 kB -
0longconn5mlm.js gzip N/A 123 B -
0p4l3ozbez2cz.js gzip N/A 2.35 kB -
0sbh_15ejop4o.js gzip N/A 13 kB -
0skdm-9rpid8g.js gzip N/A 117 B -
0wv-h56sz83wn.js gzip N/A 120 B -
137xup2t69ovc.js gzip N/A 1.97 kB -
1ezuqvubf86h1.js gzip N/A 5.88 kB -
1fk10s3m1oecx.js gzip N/A 400 B -
1hut5u-lz2yif.js gzip N/A 117 B -
20qhkyyj2_tla.js gzip N/A 116 B -
2imyufe18bsb7.js gzip N/A 1.36 kB -
2p4n3-8-xixh_.js gzip N/A 341 B -
2vqdfieehz5do.js gzip N/A 8.75 kB -
2xn85ykzw2v1e.js gzip N/A 13.1 kB -
34knadd6wu9qg.js gzip N/A 119 B -
35eub0y5wk0-c.js gzip N/A 7.53 kB -
37b0_t16yn97f.js gzip N/A 153 B -
39jq2b6t6z6up.js gzip N/A 339 B -
3a9a9tvkag_-j.js gzip N/A 2.52 kB -
3d61tgick8g6b.js gzip N/A 46.8 kB -
3t121tj-h0kbm.js gzip N/A 125 B -
Total 299 kB 299 kB ⚠️ +3 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 1.02 kB 1.03 kB
Total 1.02 kB 1.03 kB ⚠️ +2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 846 B 847 B
Total 846 B 847 B ⚠️ +1 B
Build Cache
Canary PR Change
00000001.sst gzip 12.6 MB 13.6 MB 🔴 +1.03 MB (+8%)
00000002.sst gzip 12.5 MB 14.3 MB 🔴 +1.74 MB (+14%)
00000003.sst gzip 14.5 MB 14.6 MB 🔴 +112 kB (+1%)
00000004.sst gzip 15.3 MB 12.4 MB 🟢 2.9 MB (-19%)
00000005.sst gzip 2.75 MB 10.1 MB 🔴 +7.33 MB (+266%)
00000006.sst gzip 10.1 MB 2.75 MB 🟢 7.32 MB (-73%)
00000007.sst gzip 59 B 59 B
00000008.meta gzip 297 kB 89 B 🟢 297 kB (-100%)
00000009.meta gzip 89 B 297 kB 🔴 +297 kB (+333607%)
00000010.meta gzip 297 kB 297 kB
00000011.meta gzip 297 kB 297 kB
00000012.sst gzip 53.4 kB 51.9 kB 🟢 1.5 kB (-3%)
00000013.sst gzip 1.79 MB 1.78 MB 🟢 3.59 kB (0%)
00000014.sst gzip 59 B 59 B
00000015.meta gzip 116 B 116 B
00000016.meta gzip 327 kB 327 kB
00000017.meta gzip 403 kB 403 kB
00000018.sst gzip 54.1 kB 52.8 kB 🟢 1.28 kB (-2%)
00000019.sst gzip 1.37 MB 1.36 MB
00000020.sst gzip 59 B 59 B
00000021.meta gzip 116 B 116 B
00000022.meta gzip 327 kB 327 kB
00000023.meta gzip 372 kB 372 kB
00000024.sst gzip 54.1 kB 52.8 kB 🟢 1.34 kB (-2%)
00000025.sst gzip 1.36 MB 1.36 MB
00000026.sst gzip 59 B 59 B
00000027.meta gzip 116 B 116 B
00000028.meta gzip 327 kB 327 kB
00000029.meta gzip 372 kB 372 kB
00000030.sst gzip 53.6 kB 52.1 kB 🟢 1.51 kB (-3%)
00000031.sst gzip 1.36 MB 1.36 MB
00000032.sst gzip 59 B 59 B
00000033.meta gzip 116 B 116 B
00000034.meta gzip 327 kB 327 kB
00000035.meta gzip 372 kB 372 kB
00000036.sst gzip 54 kB 52.8 kB 🟢 1.27 kB (-2%)
00000037.sst gzip 1.36 MB 1.36 MB
00000038.sst gzip 59 B 59 B
00000039.meta gzip 116 B 116 B
00000040.meta gzip 327 kB 327 kB
00000041.meta gzip 372 kB 372 kB
CURRENT gzip 94 B 94 B
LOG gzip 670 B 664 B
Total 79.6 MB 79.6 MB ✅ -25.5 kB

📦 Webpack

Client

Main Bundles
Canary PR Change
3322-HASH.js gzip 65.7 kB N/A -
4191.HASH.js gzip 169 B N/A -
9784-HASH.js gzip 5.6 kB N/A -
b1ad9f4c-HASH.js gzip 63.5 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 253 B 255 B
main-HASH.js gzip 39.8 kB 39.7 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
3577.HASH.js gzip N/A 168 B -
578-HASH.js gzip N/A 65.8 kB -
8590-HASH.js gzip N/A 5.57 kB -
a8984546-HASH.js gzip N/A 63.5 kB -
Total 236 kB 237 kB ⚠️ +108 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 331 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 253 B
head-HASH.js gzip 349 B 351 B
hooks-HASH.js gzip 382 B 384 B
image-HASH.js gzip 5.05 kB 5.05 kB
index-HASH.js gzip 260 B 259 B
link-HASH.js gzip 2.48 kB 2.48 kB
routerDirect..HASH.js gzip 317 B 318 B
script-HASH.js gzip 384 B 386 B
withRouter-HASH.js gzip 316 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 12.4 kB 12.4 kB ✅ -9 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 128 kB 128 kB
page.js gzip 293 kB 293 kB
Total 421 kB 421 kB ✅ -391 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 598 B 601 B
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 45.7 kB 45.2 kB 🟢 463 B (-1%)
edge-runtime..pack.js gzip 842 B 842 B
Total 47.3 kB 46.8 kB ✅ -460 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 699 B 699 B
Total 699 B 699 B
Build Cache
Canary PR Change
0.pack gzip 4.8 MB 4.79 MB 🟢 12 kB (0%)
index.pack gzip 124 kB 124 kB
index.pack.old gzip 125 kB 122 kB 🟢 2.58 kB (-2%)
Total 5.05 MB 5.04 MB ✅ -14.8 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 375 kB 375 kB
app-page-exp..prod.js gzip 206 kB 206 kB
app-page-tur...dev.js gzip 374 kB 374 kB
app-page-tur..prod.js gzip 206 kB 206 kB
app-page-tur...dev.js gzip 370 kB 370 kB
app-page-tur..prod.js gzip 204 kB 204 kB
app-page.run...dev.js gzip 371 kB 371 kB
app-page.run..prod.js gzip 204 kB 204 kB
app-route-ex...dev.js gzip 82.6 kB 82.6 kB
app-route-ex..prod.js gzip 55.7 kB 55.7 kB
app-route-tu...dev.js gzip 82.6 kB 82.6 kB
app-route-tu..prod.js gzip 55.7 kB 55.7 kB
app-route-tu...dev.js gzip 82.2 kB 82.2 kB
app-route-tu..prod.js gzip 55.4 kB 55.4 kB
app-route.ru...dev.js gzip 82.2 kB 82.2 kB
app-route.ru..prod.js gzip 55.4 kB 55.4 kB
dev-validati...dev.js gzip 134 kB 134 kB
dev-validati...dev.js gzip 134 kB 134 kB
dev-validati...dev.js gzip 132 kB 132 kB
dev-validati...dev.js gzip 132 kB 132 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 46.3 kB 46.3 kB
pages-api-tu..prod.js gzip 34.3 kB 34.3 kB
pages-api.ru...dev.js gzip 46.2 kB 46.2 kB
pages-api.ru..prod.js gzip 34.3 kB 34.3 kB
pages-turbo....dev.js gzip 54.7 kB 54.7 kB
pages-turbo...prod.js gzip 39.7 kB 39.7 kB
pages.runtim...dev.js gzip 54.7 kB 54.7 kB
pages.runtim..prod.js gzip 39.6 kB 39.6 kB
server.runti..prod.js gzip 65.9 kB 65.9 kB
use-cache-pr...dev.js gzip 73.3 kB 73.3 kB
use-cache-pr...dev.js gzip 73.3 kB 73.3 kB
use-cache-pr...dev.js gzip 71.5 kB 71.5 kB
use-cache-pr...dev.js gzip 71.5 kB 71.5 kB
Total 4.1 MB 4.1 MB
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/2f009c8e53cb871bef95bea0cb8634ccf493f3de/next

Commit: 2f009c8

@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from ddcdb03 to 45b02ef Compare August 25, 2026 12:09
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 45b02ef to 78d2875 Compare August 25, 2026 13:04
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 78d2875 to e49ddd5 Compare August 25, 2026 14:23
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from e49ddd5 to bf40dd6 Compare August 25, 2026 16:49
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from bf40dd6 to 439383a Compare August 25, 2026 16:58
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 439383a to 2f009c8 Compare August 26, 2026 12:36
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 2f009c8 to 7665272 Compare August 28, 2026 08:01
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch 2 times, most recently from 551b095 to a96be6d Compare September 8, 2026 11:04
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from a96be6d to 148523b Compare September 8, 2026 20:57
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 148523b to 03c83a9 Compare September 9, 2026 01:19
@sokra
sokra marked this pull request as ready for review September 9, 2026 08:25
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 03c83a9 to 8dc6f73 Compare September 9, 2026 08:25
@sokra
sokra requested a review from bgw September 9, 2026 08:25
@sokra

sokra commented Sep 10, 2026

Copy link
Copy Markdown
Member Author

Looks like the CI job build-and-test / test next-swc wasi / build runs into the 30min timeout quite often. I think it needs a larger timeout

/// Timing-based on purpose: a lock that returned immediately without blocking would satisfy a
/// pure handover assertion, so real elapsed time is what distinguishes blocking from spinning
/// past the guard.
#[test]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine, but probably overkill, as there are tons of other tests that will fail if parking_lot is misconfigured. This just reads as a unit test for parking_lot.

Comment on lines +337 to +353

// How much of the input gets mutated depends on the chunking, which is derived from
// `available_parallelism()`: each chunk stops at its first error, so items after one in the
// same chunk are never visited. Asserting `[11, 12, 13, 14, 15]` would only hold where the
// chunk size is 1, and fails anywhere parallelism is reported as 1 — a single-core machine,
// or wasm. Assert the parallelism-independent contract instead: every item is either
// untouched or incremented exactly once, and the first one was visited.
assert_eq!(input.len(), 5);
for (i, &value) in input.iter().enumerate() {
let original = i as i32 + 1;
assert!(
value == original || value == original + 10,
"input[{i}] = {value}, expected {original} or {}",
original + 10
);
}
assert_eq!(input[0], 11);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but I think this also really waters down the test, this really only tests that the first iteration does any sort of mutation. The original test was asserting that we try to start multiple jobs in parallel.

What if we just call available_parallelism() here, and size the test appropriately from that? On wasm the test might still be pretty useless, but at least it would still be useful on other platforms.

Otherwise, I think we should just delete the test. In this current state it seems pretty useless.

@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 8dc6f73 to 55c346f Compare September 12, 2026 13:11
`parking_lot_core` picks its thread parker in `thread_parker/mod.rs`. The
working wasm parker (`wasm_atomic.rs`, built on `memory_atomic_wait32` /
`memory_atomic_notify`) is selected only under

    all(feature = "nightly", target_family = "wasm", target_feature = "atomics")

Otherwise it falls back to `wasm.rs`, whose `park()` is
`panic!("Parking not supported on this platform")`. `wasm32-wasip1-threads`
does report `target_feature = "atomics"`, so the only thing missing was the
feature — every contended lock panicked, which is why 35 tests were ignored
on wasm.

Two changes are needed and neither alone is enough:

- bump `parking_lot_core` 0.9.8 -> 0.9.12, because 0.9.8's atomic parker needs
  `feature(stdsimd)`, removed from Rust long ago;
- enable `parking_lot`'s `nightly` feature for wasm targets only (it forwards
  to `parking_lot_core/nightly`). 0.9.12 *still* gates the atomic parker behind
  it, so a bump on its own keeps selecting the panicking stub silently.

Verified on the resolved feature graph rather than the manifest: `nightly` is
present for `wasm32-wasip1-threads` and absent for the host.

`contended_mutex_blocks_and_hands_over` is the regression test, built so it
cannot pass vacuously: a barrier guarantees the waiter contends, the waiter
must block for a measurable interval, and it must observe the holder's write.
With the feature removed it fails at `thread_parker/wasm.rs:26`.

33 of the 35 ignores are removed. The other two --
`scope::tests::test_scope_runs_in_parallel` and
`priority_runner::tests::test_mixed_cpu_bound_and_waiting_tasks` -- now carry
an accurate reason: their work completes in ~500ms of an 800ms serial sum, so
the parallelism is real, but dropping a multi-thread tokio runtime while their
blocking helpers are still alive deadlocks on wasm. That was previously hidden,
because `panic = abort` killed the process at the failing assertion before
teardown ran. It is fixed in the wasm runtime layer.

    turbo-tasks         54 pass / 28 ignored -> 72 pass / 11 ignored
    turbo-tasks-backend 66 pass / 32 ignored -> 82 pass / 15 ignored
    native                    0 ignored, unchanged

Also fixes a latent test bug unrelated to wasm: `test_parallel_try_for_each_mut`
asserted every element was incremented, which only holds when the chunk size is
1. Chunking comes from `available_parallelism() * 4` and each chunk stops at its
first error, so with parallelism 1 the chunk size is 2 and every second item is
skipped -- it would fail on any single-core machine. It now asserts the
parallelism-independent contract.

Co-authored-by: Luke Sandberg <210140+lukesandberg@users.noreply.github.com>
Co-authored-by: Tobias Koppers <1365881+sokra@users.noreply.github.com>

This also removes the 16 temporary `scope_unbounded` ignores that the
previous layer had to add: with a working parker, 12 of them pass, 3 are
re-labelled `no unwinding on wasm` (they use `catch_unwind` with an
intentional panic, which cannot work on a `panic = abort` target), and 1
becomes the runtime-teardown reason. The net effect on that module is the
4 ignores this layer would have added anyway.
@sokra
sokra force-pushed the codex/turbopack-wasm/parking-lot-atomics branch from 55c346f to c58ce2a Compare September 12, 2026 16:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants