Files
zed/crates/scheduler/Cargo.toml
T
Cameron Mcloughlin be5535ef7b treesitter: Worker-pinned treesitter parsing (#62784)
Bumps the treesitter version to include
https://github.com/tree-sitter/tree-sitter/pull/5851

Also makes some changes to `cx.spawn_dedicated` to make it work on web:
- remove the blocking `recv` on the main thread
- adds a new variant `TaskState::Rendezvous` to allow this code to
synchronously return a task

`TaskState::Rendezvous` is needed because of how
`spawn_dedicated_thread` works:
- the caller provides a callback that produces a non-`Send` `Future` on
the dedicated thread
- the callback is sent to the dedicated thread, executed, and the
resulting `Task` is sent back to the main thread
- this all happens synchronously, so that `spawn_dedicated_thread`
returns a synchronous `Task`

However, the blocking `recv` on the main thread traps on the main worker
in the browser.

This PR replaces that with a call to `recv_async`, but this requires a
new `Rendezvous` variant on `TaskState` which represents "a task that it
still waiting to receive the underlying handle from the dedicated
thread".

It also enables the `flume/spin` feature on the web, which is needed to
avoid a synchronous lock acquisition in `send` (it's replaced with a
spinlock). Note that `send_async` wouldn't work here because it acquires
the same lock, and it's unnecessary because `send` only blocks when the
channel is full, but it's an unbounded channel.

---

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-08-18 16:55:09 +00:00

44 lines
1.4 KiB
TOML

[package]
name = "scheduler"
version = "0.1.0"
edition.workspace = true
publish.workspace = true
license = "Apache-2.0"
[lints]
workspace = true
[lib]
path = "src/scheduler.rs"
doctest = false
[features]
test-support = []
# Allows `spawn_dedicated` to create real threads on wasm targets by spawning
# web workers. Off by default because it requires shared-memory threading
# (atomics + bulk-memory); wasm consumers without those build flags keep
# compiling, and `spawn_dedicated` panics at runtime instead.
#
# `flume/spin` replaces flume's internal `std::sync::Mutex` with a spinlock:
# a contended `std` lock parks with `Atomics.wait`, which the browser forbids
# on the main thread, and the main thread sends on flume channels every time
# it schedules work onto a dedicated thread.
wasm-threads = ["dep:wasm_thread", "flume/spin"]
[dependencies]
async-task.workspace = true
backtrace.workspace = true
chrono.workspace = true
flume.workspace = true
futures.workspace = true
parking_lot.workspace = true
rand.workspace = true
web-time.workspace = true
[target.'cfg(target_family = "wasm")'.dependencies]
# Forked because upstream is unmaintained and its worker bootstrap still calls
# the wasm-bindgen init function with the positional arguments deprecated in 0.2.93.
wasm_thread = { git = "https://github.com/zed-industries/wasm_thread", rev = "0cf96c7708dfb97ccf3da50347e25edcf75d6937", version = "0.3", features = [
"es_modules",
], optional = true }