fix multithread
This commit is contained in:
+1
-1
@@ -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,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"]
|
||||||
|
|||||||
@@ -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
@@ -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| {
|
||||||
|
|||||||
Reference in New Issue
Block a user