fix multithread

This commit is contained in:
2026-09-01 08:18:26 +07:00
parent 3290f71fa4
commit 6a7bf17e6e
4 changed files with 14 additions and 33 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ console_log = "1.0"
wasm-bindgen = "0.2" wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4" wasm-bindgen-futures = "0.4"
js-sys = "0.3" js-sys = "0.3"
web-sys = { version = "0.3", features = ["Window", "Performance", "Location"] } web-sys = { version = "0.3", features = ["Window", "Performance"] }
universal-time = { git = "https://github.com/shadowylab/universal-time" } universal-time = { git = "https://github.com/shadowylab/universal-time" }
[target.'cfg(target_arch = "wasm32")'.dependencies] [target.'cfg(target_arch = "wasm32")'.dependencies]
+1 -1
View File
@@ -1,4 +1,4 @@
[toolchain] [toolchain]
channel = "nightly" channel = "nightly"
components = ["rustfmt", "clippy", "rust-src"] components = ["rustfmt", "clippy"]
targets = ["wasm32-unknown-unknown"] targets = ["wasm32-unknown-unknown"]
+5 -3
View File
@@ -37,12 +37,14 @@ fi
# Step 1: Build WASM # Step 1: Build WASM
# #
# Target features and link args (atomics, shared memory, TLS exports) come # Single-threaded build: `+bulk-memory` only. The multithreaded web backend
# from `web/.cargo/config.toml`, which also enables `-Z build-std` so std is # is disabled in `web/src/lib.rs` (gpui's wasm workers freeze their JS event
# rebuilt with atomics support. # loop in `Atomics.wait`, which breaks nostr-sdk's spawn_local-driven client
# and the WebSocket transport), so no atomics/shared-memory flags here.
echo -e "${GREEN}Step 1: Building WASM...${NC}" echo -e "${GREEN}Step 1: Building WASM...${NC}"
cd "$PROJECT_ROOT" cd "$PROJECT_ROOT"
export CARGO_TARGET_DIR="$PROJECT_ROOT/target" export CARGO_TARGET_DIR="$PROJECT_ROOT/target"
RUSTFLAGS='-C target-feature=+bulk-memory -C link-arg=--max-memory=4294967296' \
cargo build --target wasm32-unknown-unknown $RELEASE_FLAG cargo build --target wasm32-unknown-unknown $RELEASE_FLAG
# Determine the build directory # Determine the build directory
+7 -28
View File
@@ -31,30 +31,6 @@ impl MonotonicClock for CustomTimeProvider {
define_time_provider!(CustomTimeProvider); define_time_provider!(CustomTimeProvider);
/// Returns the preferred WebGPU/WebGL backend, selected with
/// `?backend=webgpu` / `?backend=webgl` in the page URL.
#[cfg(target_family = "wasm")]
fn requested_backend() -> gpui_platform::WebBackendPreference {
let search = web_sys::window()
.and_then(|window| window.location().search().ok())
.unwrap_or_default();
if search
.trim_start_matches('?')
.split('&')
.any(|parameter| parameter == "backend=webgpu")
{
gpui_platform::WebBackendPreference::WebGpu
} else if search
.trim_start_matches('?')
.split('&')
.any(|parameter| parameter == "backend=webgl")
{
gpui_platform::WebBackendPreference::WebGl
} else {
gpui_platform::WebBackendPreference::Auto
}
}
thread_local! { thread_local! {
static APPLICATION: RefCell<Option<ApplicationHandle>> = const { RefCell::new(None) }; static APPLICATION: RefCell<Option<ApplicationHandle>> = const { RefCell::new(None) };
} }
@@ -120,10 +96,13 @@ pub async fn run() -> Result<(), JsValue> {
// immediately instead of waiting for a repaint. // immediately instead of waiting for a repaint.
assets.preload().await; assets.preload().await;
// Multithreaded web: background work (image decoding, network // NOTE: the multithreaded web backend (application_with_web_backend)
// fetches, CPU-heavy tasks) runs on real worker threads instead of // cannot host this app's backend. gpui's wasm background workers
// the main thread, so the UI stays responsive. // block on `Atomics.wait` while idle, freezing their JS event loop,
gpui_platform::application_with_web_backend(requested_backend()).with_assets(assets) // so `spawn_local`-driven tasks (nostr-sdk's client actor, the
// WebSocket transport) and fetch promises never make progress on a
// worker thread. Everything must run on the main thread.
gpui_platform::single_threaded_web().with_assets(assets)
}; };
let launch = move |cx: &mut App| { let launch = move |cx: &mut App| {