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 ...
44 lines
1.4 KiB
TOML
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 }
|