diff --git a/Cargo.lock b/Cargo.lock index 05a2536b4e..5c2781c649 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "action_log", "agent-client-protocol", "anyhow", + "async-channel 2.5.0", "base64 0.22.1", "buffer_diff", "chrono", @@ -34,7 +35,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "task", "telemetry", "terminal", @@ -152,6 +152,8 @@ dependencies = [ "agent_servers", "agent_settings", "anyhow", + "async-channel 2.5.0", + "async-io", "chrono", "client", "clock", @@ -198,7 +200,6 @@ dependencies = [ "settings", "shell_command_parser", "smallvec", - "smol", "sqlez", "streaming_diff", "strsim", @@ -280,6 +281,7 @@ dependencies = [ "action_log", "agent-client-protocol", "anyhow", + "async-channel 2.5.0", "chrono", "client", "collections", @@ -303,7 +305,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "task", "tempfile", "terminal", @@ -351,6 +352,7 @@ dependencies = [ "agent_settings", "ai_onboarding", "anyhow", + "async-channel 2.5.0", "audio", "base64 0.22.1", "buffer_diff", @@ -419,7 +421,6 @@ dependencies = [ "serde_json", "serde_json_lenient", "settings", - "smol", "streaming_diff", "task", "telemetry", @@ -935,7 +936,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ - "async-lock 3.4.2", + "async-lock", "blocking", "futures-lite 2.6.1", ] @@ -949,7 +950,7 @@ dependencies = [ "async-channel 2.5.0", "async-executor", "async-io", - "async-lock 3.4.2", + "async-lock", "blocking", "futures-lite 2.6.1", "once_cell", @@ -973,15 +974,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - [[package]] name = "async-lock" version = "3.4.2" @@ -1021,7 +1013,7 @@ checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel 2.5.0", "async-io", - "async-lock 3.4.2", + "async-lock", "async-signal", "async-task", "blocking", @@ -1049,7 +1041,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", - "async-lock 3.4.2", + "async-lock", "atomic-waker", "cfg-if", "futures-core", @@ -1070,7 +1062,7 @@ dependencies = [ "async-channel 1.9.0", "async-global-executor", "async-io", - "async-lock 3.4.2", + "async-lock", "async-process", "crossbeam-utils", "futures-channel", @@ -2962,6 +2954,7 @@ name = "client" version = "0.1.0" dependencies = [ "anyhow", + "async-channel 2.5.0", "async-tungstenite", "base64 0.22.1", "chrono", @@ -3029,6 +3022,7 @@ name = "cloud_api_client" version = "0.1.0" dependencies = [ "anyhow", + "async-lock", "cloud_api_types", "futures 0.3.32", "gpui", @@ -3036,7 +3030,6 @@ dependencies = [ "http_client", "parking_lot", "serde_json", - "smol", "thiserror 2.0.17", "yawc", ] @@ -3183,6 +3176,7 @@ version = "0.44.0" dependencies = [ "agent", "anyhow", + "async-channel 2.5.0", "async-trait", "async-tungstenite", "aws-config", @@ -3560,15 +3554,19 @@ name = "context_server" version = "0.1.0" dependencies = [ "anyhow", + "async-channel 2.5.0", + "async-process", "async-trait", "base64 0.22.1", "collections", "futures 0.3.32", + "futures-lite 1.13.0", "gpui", "http_client", "log", "net", "parking_lot", + "pollster 0.4.0", "postage", "rand 0.9.3", "schemars 1.0.4", @@ -3577,7 +3575,6 @@ dependencies = [ "settings", "sha2", "slotmap", - "smol", "tempfile", "tiny_http", "url", @@ -4114,6 +4111,7 @@ dependencies = [ name = "crashes" version = "0.1.0" dependencies = [ + "async-process", "cfg-if", "crash-handler", "futures 0.3.32", @@ -4125,7 +4123,6 @@ dependencies = [ "release_channel", "serde", "serde_json", - "smol", "system_specs", "windows 0.61.3", "zstd", @@ -4657,7 +4654,6 @@ dependencies = [ "log", "paths", "release_channel", - "smol", "sqlez", "sqlez_macros", "tempfile", @@ -5476,6 +5472,7 @@ dependencies = [ "file_icons", "fs", "futures 0.3.32", + "futures-lite 1.13.0", "fuzzy", "git", "gpui", @@ -5506,7 +5503,6 @@ dependencies = [ "serde_json", "settings", "smallvec", - "smol", "snippet", "sum_tree", "task", @@ -6590,6 +6586,7 @@ version = "0.1.0" dependencies = [ "anyhow", "ashpd", + "async-channel 2.5.0", "async-tar", "async-trait", "collections", @@ -7267,6 +7264,7 @@ version = "0.1.0" dependencies = [ "anyhow", "askpass", + "async-channel 2.5.0", "async-trait", "collections", "derive_more", @@ -7316,6 +7314,7 @@ name = "git_graph" version = "0.1.0" dependencies = [ "anyhow", + "async-channel 2.5.0", "collections", "db", "editor", @@ -7334,7 +7333,6 @@ dependencies = [ "serde_json", "settings", "smallvec", - "smol", "theme", "theme_settings", "time", @@ -7382,6 +7380,7 @@ dependencies = [ "file_icons", "fs", "futures 0.3.32", + "futures-lite 1.13.0", "fuzzy", "fuzzy_nucleo", "git", @@ -7410,7 +7409,6 @@ dependencies = [ "serde_json", "settings", "smallvec", - "smol", "strum 0.27.2", "task", "telemetry", @@ -9475,6 +9473,7 @@ dependencies = [ "encoding_rs", "fs", "futures 0.3.32", + "futures-lite 1.13.0", "fuzzy", "globset", "gpui", @@ -9497,7 +9496,6 @@ dependencies = [ "settings", "shellexpand", "smallvec", - "smol", "streaming-iterator", "strsim", "sum_tree", @@ -9595,6 +9593,7 @@ name = "language_model_core" version = "0.1.0" dependencies = [ "anyhow", + "async-lock", "cloud_llm_client", "futures 0.3.32", "gpui_shared_string", @@ -9603,7 +9602,6 @@ dependencies = [ "schemars 1.0.4", "serde", "serde_json", - "smol", "strum 0.27.2", "thiserror 2.0.17", ] @@ -9615,6 +9613,7 @@ dependencies = [ "ai_onboarding", "anthropic", "anyhow", + "async-lock", "aws-config", "aws-credential-types", "aws_http_client", @@ -9656,7 +9655,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "strum 0.27.2", "tokio", "ui", @@ -9683,7 +9681,6 @@ dependencies = [ "semver", "serde", "serde_json", - "smol", "thiserror 2.0.17", ] @@ -10912,6 +10909,7 @@ dependencies = [ "clock", "collections", "ctor", + "futures-lite 1.13.0", "gpui", "indoc", "itertools 0.14.0", @@ -10924,7 +10922,6 @@ dependencies = [ "serde", "settings", "smallvec", - "smol", "sum_tree", "text", "theme", @@ -11198,7 +11195,7 @@ dependencies = [ "channel", "client", "component", - "db", + "futures-lite 1.13.0", "gpui", "rpc", "sum_tree", @@ -11792,7 +11789,7 @@ dependencies = [ "ashpd", "async-fs", "async-io", - "async-lock 3.4.2", + "async-lock", "blocking", "cbc", "cipher", @@ -12035,6 +12032,7 @@ name = "outline" version = "0.1.0" dependencies = [ "editor", + "futures 0.3.32", "fuzzy", "gpui", "indoc", @@ -12047,7 +12045,6 @@ dependencies = [ "rope", "serde_json", "settings", - "smol", "theme", "theme_settings", "ui", @@ -12061,10 +12058,12 @@ name = "outline_panel" version = "0.1.0" dependencies = [ "anyhow", + "async-channel 2.5.0", "collections", "db", "editor", "file_icons", + "futures 0.3.32", "fuzzy", "gpui", "itertools 0.14.0", @@ -12080,7 +12079,6 @@ dependencies = [ "serde_json", "settings", "smallvec", - "smol", "theme", "theme_settings", "ui", @@ -13440,6 +13438,7 @@ dependencies = [ "aho-corasick", "anyhow", "askpass", + "async-channel 2.5.0", "async-trait", "base64 0.22.1", "buffer_diff", @@ -14404,7 +14403,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "task", "telemetry", "ui", @@ -14606,6 +14604,7 @@ dependencies = [ "agent", "anyhow", "askpass", + "async-channel 2.5.0", "cargo_toml", "clap", "client", @@ -15744,6 +15743,7 @@ dependencies = [ "editor", "fs", "futures 0.3.32", + "futures-lite 1.13.0", "gpui", "itertools 0.14.0", "language", @@ -15755,7 +15755,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "theme", "theme_settings", "tracing", @@ -16304,6 +16303,7 @@ dependencies = [ "agent_settings", "agent_ui", "anyhow", + "async-channel 2.5.0", "chrono", "client", "clock", @@ -16333,7 +16333,6 @@ dependencies = [ "serde", "serde_json", "settings", - "smol", "telemetry", "theme", "theme_settings", @@ -16518,7 +16517,7 @@ dependencies = [ "async-executor", "async-fs", "async-io", - "async-lock 3.4.2", + "async-lock", "async-net", "async-process", "blocking", @@ -16689,7 +16688,7 @@ dependencies = [ "libsqlite3-sys", "log", "parking_lot", - "smol", + "pollster 0.4.0", "sqlformat", "thread_local", "util", @@ -17773,8 +17772,10 @@ version = "0.1.0" dependencies = [ "alacritty_terminal", "anyhow", + "async-channel 2.5.0", "collections", "futures 0.3.32", + "futures-lite 1.13.0", "gpui", "itertools 0.14.0", "libc", @@ -17787,7 +17788,6 @@ dependencies = [ "schemars 1.0.4", "serde", "settings", - "smol", "sysinfo 0.37.2", "task", "theme", @@ -21925,6 +21925,7 @@ dependencies = [ "db", "fs", "futures 0.3.32", + "futures-lite 1.13.0", "git", "gpui", "http_client", @@ -21967,7 +21968,8 @@ name = "worktree" version = "0.1.0" dependencies = [ "anyhow", - "async-lock 2.8.0", + "async-channel 2.5.0", + "async-lock", "chardetng", "clock", "collections", @@ -21990,7 +21992,6 @@ dependencies = [ "serde_json", "settings", "smallvec", - "smol", "sum_tree", "text", "tracing", @@ -22327,7 +22328,7 @@ dependencies = [ "async-broadcast", "async-executor", "async-io", - "async-lock 3.4.2", + "async-lock", "async-process", "async-recursion", "async-task", diff --git a/Cargo.toml b/Cargo.toml index 5d403c48c6..b607b2f3f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -514,13 +514,15 @@ async-compat = "0.2.1" async-compression = { version = "0.4", features = ["bzip2", "gzip", "futures-io"] } async-dispatcher = "0.1" async-fs = "2.1" -async-lock = "2.1" +async-io = "2.6.0" +async-lock = "3.4.2" async-pipe = { git = "https://github.com/zed-industries/async-pipe-rs", rev = "82d00a04211cf4e1236029aa03e6b6ce2a74c553" } async-recursion = "1.0.0" async-tar = "0.5.1" async-task = "4.7" async-trait = "0.1" async-tungstenite = "0.31.0" +async-process = "2.5.0" async_zip = { version = "0.0.18", features = ["deflate", "deflate64"] } aws-config = { version = "1.8.10", features = ["behavior-version-latest"] } aws-credential-types = { version = "1.2.8", features = [ diff --git a/crates/acp_thread/Cargo.toml b/crates/acp_thread/Cargo.toml index 56ead8ada6..987db1dcf8 100644 --- a/crates/acp_thread/Cargo.toml +++ b/crates/acp_thread/Cargo.toml @@ -18,6 +18,7 @@ test-support = ["gpui/test-support", "project/test-support", "dep:parking_lot", [dependencies] action_log.workspace = true agent-client-protocol.workspace = true +async-channel.workspace = true base64.workspace = true anyhow.workspace = true buffer_diff.workspace = true @@ -41,7 +42,6 @@ prompt_store.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true task.workspace = true telemetry.workspace = true terminal.workspace = true diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index 61bee3ff85..42c6af3836 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -3047,6 +3047,7 @@ fn markdown_for_raw_output( mod tests { use super::*; use anyhow::anyhow; + use futures::stream::StreamExt as _; use futures::{channel::mpsc, future::LocalBoxFuture, select}; use gpui::{App, AsyncApp, TestAppContext, WeakEntity}; use indoc::indoc; @@ -3054,7 +3055,6 @@ mod tests { use rand::{distr, prelude::*}; use serde_json::json; use settings::SettingsStore; - use smol::stream::StreamExt as _; use std::{ any::Any, cell::RefCell, @@ -3259,7 +3259,7 @@ mod tests { // Create a real PTY terminal that runs a command which prints output then sleeps // We use printf instead of echo and chain with && sleep to ensure proper execution - let (completion_tx, _completion_rx) = smol::channel::unbounded(); + let (completion_tx, _completion_rx) = async_channel::unbounded(); let (program, args) = ShellBuilder::new(&Shell::System, false).build( Some("printf 'output_before_kill\\n' && sleep 60".to_owned()), &[], diff --git a/crates/acp_thread/src/connection.rs b/crates/acp_thread/src/connection.rs index 4bbf13bdb5..bbb967530e 100644 --- a/crates/acp_thread/src/connection.rs +++ b/crates/acp_thread/src/connection.rs @@ -318,7 +318,7 @@ pub trait AgentSessionList { Task::ready(Err(anyhow::anyhow!("delete_sessions not supported"))) } - fn watch(&self, _cx: &mut App) -> Option> { + fn watch(&self, _cx: &mut App) -> Option> { None } diff --git a/crates/agent/Cargo.toml b/crates/agent/Cargo.toml index a5a4c2742a..ce472fd9e3 100644 --- a/crates/agent/Cargo.toml +++ b/crates/agent/Cargo.toml @@ -19,6 +19,7 @@ workspace = true [dependencies] acp_thread.workspace = true action_log.workspace = true +async-channel.workspace = true agent-client-protocol.workspace = true agent_servers.workspace = true agent_settings.workspace = true @@ -59,7 +60,6 @@ serde_json.workspace = true settings.workspace = true shell_command_parser.workspace = true smallvec.workspace = true -smol.workspace = true sqlez.workspace = true streaming_diff.workspace = true strsim.workspace = true @@ -77,6 +77,7 @@ zed_env_vars.workspace = true zstd.workspace = true [dev-dependencies] +async-io.workspace = true agent_servers = { workspace = true, "features" = ["test-support"] } client = { workspace = true, "features" = ["test-support"] } clock = { workspace = true, "features" = ["test-support"] } diff --git a/crates/agent/src/agent.rs b/crates/agent/src/agent.rs index c5bc4c5828..45da8c9216 100644 --- a/crates/agent/src/agent.rs +++ b/crates/agent/src/agent.rs @@ -1743,14 +1743,14 @@ impl acp_thread::AgentTelemetry for NativeAgentConnection { pub struct NativeAgentSessionList { thread_store: Entity, - updates_tx: smol::channel::Sender, - updates_rx: smol::channel::Receiver, + updates_tx: async_channel::Sender, + updates_rx: async_channel::Receiver, _subscription: Subscription, } impl NativeAgentSessionList { fn new(thread_store: Entity, cx: &mut App) -> Self { - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); let this_tx = tx.clone(); let subscription = cx.observe(&thread_store, move |_, _| { this_tx @@ -1802,7 +1802,7 @@ impl AgentSessionList for NativeAgentSessionList { fn watch( &self, _cx: &mut App, - ) -> Option> { + ) -> Option> { Some(self.updates_rx.clone()) } diff --git a/crates/agent/src/edit_agent/evals.rs b/crates/agent/src/edit_agent/evals.rs index ba8b7ed867..c1c2886f84 100644 --- a/crates/agent/src/edit_agent/evals.rs +++ b/crates/agent/src/edit_agent/evals.rs @@ -1670,7 +1670,7 @@ async fn retry_on_rate_limit(mut request: impl AsyncFnMut() -> Result) -> eprintln!("Attempt #{attempt}: Retry after {retry_after:?} + jitter of {jitter:?}"); // This code does not use the gpui::executor #[allow(clippy::disallowed_methods)] - smol::Timer::after(retry_after + jitter).await; + async_io::Timer::after(retry_after + jitter).await; } else { return response; } diff --git a/crates/agent/src/tools/evals/streaming_edit_file.rs b/crates/agent/src/tools/evals/streaming_edit_file.rs index 0c6290ec09..3156fd2539 100644 --- a/crates/agent/src/tools/evals/streaming_edit_file.rs +++ b/crates/agent/src/tools/evals/streaming_edit_file.rs @@ -729,7 +729,7 @@ async fn retry_on_rate_limit(mut request: impl AsyncFnMut() -> Result) -> let jitter = retry_after.mul_f64(rand::rng().random_range(0.0..1.0)); eprintln!("Attempt #{attempt}: Retry after {retry_after:?} + jitter of {jitter:?}"); #[allow(clippy::disallowed_methods)] - smol::Timer::after(retry_after + jitter).await; + async_io::Timer::after(retry_after + jitter).await; } else { return response; } diff --git a/crates/agent_servers/Cargo.toml b/crates/agent_servers/Cargo.toml index c8970ec57a..1a12a54157 100644 --- a/crates/agent_servers/Cargo.toml +++ b/crates/agent_servers/Cargo.toml @@ -20,6 +20,7 @@ doctest = false acp_tools.workspace = true acp_thread.workspace = true action_log.workspace = true +async-channel.workspace = true agent-client-protocol.workspace = true anyhow.workspace = true chrono.workspace = true @@ -43,7 +44,6 @@ reqwest_client = { workspace = true, optional = true } serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true task.workspace = true tempfile.workspace = true thiserror.workspace = true diff --git a/crates/agent_servers/src/acp.rs b/crates/agent_servers/src/acp.rs index 28ec60e404..57ca7ddeac 100644 --- a/crates/agent_servers/src/acp.rs +++ b/crates/agent_servers/src/acp.rs @@ -286,13 +286,13 @@ pub struct AcpSession { pub struct AcpSessionList { connection: ConnectionTo, - updates_tx: smol::channel::Sender, - updates_rx: smol::channel::Receiver, + updates_tx: async_channel::Sender, + updates_rx: async_channel::Receiver, } impl AcpSessionList { fn new(connection: ConnectionTo) -> Self { - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); Self { connection, updates_tx: tx, @@ -353,7 +353,7 @@ impl AgentSessionList for AcpSessionList { fn watch( &self, _cx: &mut App, - ) -> Option> { + ) -> Option> { Some(self.updates_rx.clone()) } @@ -1654,7 +1654,7 @@ pub mod test_support { close_session_count: Arc, fail_next_prompt: Arc, exit_status_sender: - Arc>>>, + Arc>>>, } impl FakeAcpAgentServer { @@ -1715,7 +1715,7 @@ pub mod test_support { cx, ) .await?; - let (exit_tx, exit_rx) = smol::channel::bounded(1); + let (exit_tx, exit_rx) = async_channel::bounded(1); *exit_status_sender .lock() .expect("exit status sender lock should not be poisoned") = Some(exit_tx); @@ -2224,7 +2224,7 @@ mod tests { Arc, Arc, Arc>>, - Arc>>>, + Arc>>>, Task>, ) { cx.update(|cx| { @@ -2240,7 +2240,7 @@ mod tests { let close_count = Arc::new(AtomicUsize::new(0)); let load_session_updates: Arc>> = Arc::new(std::sync::Mutex::new(Vec::new())); - let load_session_gate: Arc>>> = + let load_session_gate: Arc>>> = Arc::new(std::sync::Mutex::new(None)); let (client_transport, agent_transport) = agent_client_protocol::Channel::duplex(); @@ -2595,7 +2595,7 @@ mod tests { // Install a gate so the fake agent's `load_session` handler parks // before sending its response. We'll close the session while the // load is parked. - let (gate_tx, gate_rx) = smol::channel::bounded::<()>(1); + let (gate_tx, gate_rx) = async_channel::bounded::<()>(1); *load_session_gate .lock() .expect("load_session_gate mutex poisoned") = Some(gate_rx); @@ -2690,7 +2690,7 @@ mod tests { _keep_agent_alive, ) = connect_fake_agent(cx).await; - let (gate_tx, gate_rx) = smol::channel::bounded::<()>(1); + let (gate_tx, gate_rx) = async_channel::bounded::<()>(1); *load_session_gate .lock() .expect("load_session_gate mutex poisoned") = Some(gate_rx); diff --git a/crates/agent_ui/Cargo.toml b/crates/agent_ui/Cargo.toml index 65be660ed0..5f5a7cc792 100644 --- a/crates/agent_ui/Cargo.toml +++ b/crates/agent_ui/Cargo.toml @@ -30,6 +30,7 @@ acp_thread.workspace = true action_log.workspace = true agent-client-protocol.workspace = true agent.workspace = true +async-channel.workspace = true agent_servers.workspace = true agent_settings.workspace = true ai_onboarding.workspace = true @@ -93,7 +94,6 @@ serde.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true settings.workspace = true -smol.workspace = true streaming_diff.workspace = true task.workspace = true telemetry.workspace = true diff --git a/crates/agent_ui/src/buffer_codegen.rs b/crates/agent_ui/src/buffer_codegen.rs index d5288c564d..8be5aa52bc 100644 --- a/crates/agent_ui/src/buffer_codegen.rs +++ b/crates/agent_ui/src/buffer_codegen.rs @@ -3,6 +3,7 @@ use agent_settings::AgentSettings; use anyhow::{Context as _, Result}; use collections::HashSet; use editor::{Anchor, AnchorRangeExt, MultiBuffer, MultiBufferSnapshot, ToOffset as _, ToPoint}; +use futures::FutureExt; use futures::{ SinkExt, Stream, StreamExt, TryStreamExt as _, channel::mpsc, @@ -28,7 +29,6 @@ use rope::Rope; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::Settings as _; -use smol::future::FutureExt; use std::{ cmp, future::Future, diff --git a/crates/agent_ui/src/inline_assistant.rs b/crates/agent_ui/src/inline_assistant.rs index 71aa7baf78..d94e0d8782 100644 --- a/crates/agent_ui/src/inline_assistant.rs +++ b/crates/agent_ui/src/inline_assistant.rs @@ -1849,12 +1849,12 @@ pub mod evals { use eval_utils::{EvalOutput, NoProcessor}; use fs::FakeFs; use futures::channel::mpsc; + use futures::stream::StreamExt as _; use gpui::{AppContext, TestAppContext, UpdateGlobal as _}; use language::Buffer; use language_model::{LanguageModelRegistry, SelectedModel}; use project::Project; use prompt_store::PromptBuilder; - use smol::stream::StreamExt as _; use std::str::FromStr; use std::sync::Arc; use util::test::marked_text_ranges; diff --git a/crates/agent_ui/src/thread_metadata_store.rs b/crates/agent_ui/src/thread_metadata_store.rs index f7ba017c16..ff6eb3b98e 100644 --- a/crates/agent_ui/src/thread_metadata_store.rs +++ b/crates/agent_ui/src/thread_metadata_store.rs @@ -469,8 +469,8 @@ pub struct ThreadMetadataStore { threads_by_session: HashMap, reload_task: Option>>, conversation_subscriptions: HashMap, - pending_thread_ops_tx: smol::channel::Sender, - in_flight_archives: HashMap, smol::channel::Sender<()>)>, + pending_thread_ops_tx: async_channel::Sender, + in_flight_archives: HashMap, async_channel::Sender<()>)>, _db_operations_task: Task<()>, } @@ -526,7 +526,7 @@ impl ThreadMetadataStore { #[cfg(any(test, feature = "test-support"))] pub fn init_global(cx: &mut App) { let db_name = TestMetadataDbName::global(cx); - let db = smol::block_on(db::open_test_db::(&db_name)); + let db = gpui::block_on(db::open_test_db::(&db_name)); let thread_store = cx.new(|cx| Self::new(ThreadMetadataDb(db), cx)); cx.set_global(GlobalThreadMetadataStore(thread_store)); } @@ -786,7 +786,7 @@ impl ThreadMetadataStore { pub fn archive( &mut self, thread_id: ThreadId, - archive_job: Option<(Task<()>, smol::channel::Sender<()>)>, + archive_job: Option<(Task<()>, async_channel::Sender<()>)>, cx: &mut Context, ) { self.update_archived(thread_id, true, cx); @@ -1109,7 +1109,7 @@ impl ThreadMetadataStore { }) .detach(); - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); let _db_operations_task = cx.background_spawn({ let db = db.clone(); async move { @@ -1787,7 +1787,7 @@ mod tests { fn clear_thread_metadata_remote_connection_backfill(cx: &mut TestAppContext) { let kvp = cx.update(|cx| KeyValueStore::global(cx)); - smol::block_on(kvp.delete_kvp("thread-metadata-remote-connection-backfill".to_string())) + gpui::block_on(kvp.delete_kvp("thread-metadata-remote-connection-backfill".to_string())) .unwrap(); } @@ -1810,7 +1810,7 @@ mod tests { let thread = std::thread::current(); let test_name = thread.name().unwrap_or("unknown_test"); let db_name = format!("THREAD_METADATA_DB_{}", test_name); - let db = ThreadMetadataDb(smol::block_on(db::open_test_db::( + let db = ThreadMetadataDb(gpui::block_on(db::open_test_db::( &db_name, ))); diff --git a/crates/agent_ui/src/threads_archive_view.rs b/crates/agent_ui/src/threads_archive_view.rs index 6204552fe6..e6e9ca4f5f 100644 --- a/crates/agent_ui/src/threads_archive_view.rs +++ b/crates/agent_ui/src/threads_archive_view.rs @@ -1335,7 +1335,7 @@ impl PickerDelegate for ProjectPickerDelegate { }) .collect(); - let mut sibling_matches = smol::block_on(fuzzy::match_strings( + let mut sibling_matches = gpui::block_on(fuzzy::match_strings( &sibling_candidates, query, smart_case, @@ -1369,7 +1369,7 @@ impl PickerDelegate for ProjectPickerDelegate { }) .collect(); - let mut recent_matches = smol::block_on(fuzzy::match_strings( + let mut recent_matches = gpui::block_on(fuzzy::match_strings( &recent_candidates, query, smart_case, diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 532fe38f7d..0a3c49d123 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -17,6 +17,7 @@ test-support = ["clock/test-support", "collections/test-support", "gpui/test-sup [dependencies] anyhow.workspace = true +async-channel.workspace = true async-tungstenite = { workspace = true, features = ["tokio", "tokio-rustls-manual-roots"] } base64.workspace = true chrono = { workspace = true, features = ["serde"] } diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 6e18f18318..95f57a6279 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -2181,8 +2181,8 @@ mod tests { }); let server = FakeServer::for_client(user_id, &client, cx).await; - let (done_tx1, done_rx1) = smol::channel::unbounded(); - let (done_tx2, done_rx2) = smol::channel::unbounded(); + let (done_tx1, done_rx1) = async_channel::unbounded(); + let (done_tx2, done_rx2) = async_channel::unbounded(); AnyProtoClient::from(client.clone()).add_entity_message_handler( move |entity: Entity, _: TypedEnvelope, cx| { match entity.read_with(&cx, |entity, _| entity.id) { @@ -2252,8 +2252,8 @@ mod tests { let server = FakeServer::for_client(user_id, &client, cx).await; let entity = cx.new(|_| TestEntity::default()); - let (done_tx1, _done_rx1) = smol::channel::unbounded(); - let (done_tx2, done_rx2) = smol::channel::unbounded(); + let (done_tx1, _done_rx1) = async_channel::unbounded(); + let (done_tx2, done_rx2) = async_channel::unbounded(); let subscription1 = client.add_message_handler( entity.downgrade(), move |_, _: TypedEnvelope, _| { @@ -2287,7 +2287,7 @@ mod tests { let server = FakeServer::for_client(user_id, &client, cx).await; let entity = cx.new(|_| TestEntity::default()); - let (done_tx, done_rx) = smol::channel::unbounded(); + let (done_tx, done_rx) = async_channel::unbounded(); let subscription = client.add_message_handler( entity.clone().downgrade(), move |entity: Entity, _: TypedEnvelope, mut cx| { diff --git a/crates/cloud_api_client/Cargo.toml b/crates/cloud_api_client/Cargo.toml index cf293d83f8..716276ccf4 100644 --- a/crates/cloud_api_client/Cargo.toml +++ b/crates/cloud_api_client/Cargo.toml @@ -20,6 +20,6 @@ gpui_tokio.workspace = true http_client.workspace = true parking_lot.workspace = true serde_json.workspace = true -smol.workspace = true +async-lock.workspace = true thiserror.workspace = true yawc.workspace = true diff --git a/crates/cloud_api_client/src/llm_token.rs b/crates/cloud_api_client/src/llm_token.rs index 711e0d51b8..662c88ab03 100644 --- a/crates/cloud_api_client/src/llm_token.rs +++ b/crates/cloud_api_client/src/llm_token.rs @@ -1,7 +1,7 @@ use std::sync::Arc; +use async_lock::{RwLock, RwLockUpgradableReadGuard, RwLockWriteGuard}; use cloud_api_types::OrganizationId; -use smol::lock::{RwLock, RwLockUpgradableReadGuard, RwLockWriteGuard}; use crate::{ClientApiError, CloudApiClient}; diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 0703d88a2c..f96b71c380 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -76,6 +76,7 @@ uuid.workspace = true [dev-dependencies] agent = { workspace = true, features = ["test-support"] } async-trait.workspace = true +async-channel.workspace = true buffer_diff.workspace = true call = { workspace = true, features = ["test-support"] } diff --git a/crates/collab/tests/integration/editor_tests.rs b/crates/collab/tests/integration/editor_tests.rs index 4eca02280e..2c723a833f 100644 --- a/crates/collab/tests/integration/editor_tests.rs +++ b/crates/collab/tests/integration/editor_tests.rs @@ -2739,9 +2739,9 @@ async fn test_lsp_pull_diagnostics( let closure_workspace_diagnostics_pulls_result_ids = workspace_diagnostics_pulls_result_ids.clone(); let (workspace_diagnostic_cancel_tx, closure_workspace_diagnostic_cancel_rx) = - smol::channel::bounded::<()>(1); + async_channel::bounded::<()>(1); let (closure_workspace_diagnostic_received_tx, workspace_diagnostic_received_rx) = - smol::channel::bounded::<()>(1); + async_channel::bounded::<()>(1); let capabilities = lsp::ServerCapabilities { diagnostic_provider: Some(lsp::DiagnosticServerCapabilities::Options( diff --git a/crates/context_server/Cargo.toml b/crates/context_server/Cargo.toml index dea98bd69e..3a51accb78 100644 --- a/crates/context_server/Cargo.toml +++ b/crates/context_server/Cargo.toml @@ -16,10 +16,13 @@ test-support = ["gpui/test-support"] [dependencies] anyhow.workspace = true +async-channel.workspace = true +async-process.workspace = true async-trait.workspace = true base64.workspace = true collections.workspace = true futures.workspace = true +futures-lite.workspace = true gpui.workspace = true http_client = { workspace = true, features = ["test-support"] } log.workspace = true @@ -33,7 +36,6 @@ serde.workspace = true settings.workspace = true sha2.workspace = true slotmap.workspace = true -smol.workspace = true tempfile.workspace = true tiny_http.workspace = true url = { workspace = true, features = ["serde"] } @@ -41,3 +43,4 @@ util.workspace = true [dev-dependencies] gpui = { workspace = true, features = ["test-support"] } +pollster.workspace = true diff --git a/crates/context_server/src/client.rs b/crates/context_server/src/client.rs index 974c25d729..676baef973 100644 --- a/crates/context_server/src/client.rs +++ b/crates/context_server/src/client.rs @@ -1,13 +1,13 @@ use anyhow::{Context as _, Result, anyhow}; use collections::HashMap; use futures::{FutureExt, StreamExt, channel::oneshot, future, select}; +use futures_lite::future::yield_now; use gpui::{AppContext as _, AsyncApp, BackgroundExecutor, Task}; use parking_lot::Mutex; use postage::barrier; use serde::{Deserialize, Serialize, de::DeserializeOwned}; use serde_json::{Value, value::RawValue}; use slotmap::SlotMap; -use smol::channel; use std::{ fmt, path::PathBuf, @@ -49,7 +49,7 @@ pub enum RequestId { pub(crate) struct Client { server_id: ContextServerId, next_id: AtomicI32, - outbound_tx: channel::Sender, + outbound_tx: async_channel::Sender, name: Arc, subscription_set: Arc>, response_handlers: Arc>>>, @@ -197,7 +197,7 @@ impl Client { request_timeout: Option, cx: AsyncApp, ) -> Result { - let (outbound_tx, outbound_rx) = channel::unbounded::(); + let (outbound_tx, outbound_rx) = async_channel::unbounded::(); let (output_done_tx, output_done_rx) = barrier::channel(); let subscription_set = Arc::new(Mutex::new(NotificationSubscriptionSet::default())); @@ -304,7 +304,7 @@ impl Client { } } - smol::future::yield_now().await; + yield_now().await; Ok(()) } @@ -324,7 +324,7 @@ impl Client { /// writes them to the server's stdin, and manages the lifecycle of response handlers. async fn handle_output( transport: Arc, - outbound_rx: channel::Receiver, + outbound_rx: async_channel::Receiver, output_done_tx: barrier::Sender, response_handlers: Arc>>>, last_transport_error: Arc>>, diff --git a/crates/context_server/src/listener.rs b/crates/context_server/src/listener.rs index ad70c6d32e..2e395e493c 100644 --- a/crates/context_server/src/listener.rs +++ b/crates/context_server/src/listener.rs @@ -1,6 +1,8 @@ use ::serde::{Deserialize, Serialize}; use anyhow::{Context as _, Result}; use collections::HashMap; +use futures::AsyncReadExt; +use futures::stream::StreamExt; use futures::{ AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, FutureExt, channel::mpsc::{UnboundedReceiver, UnboundedSender, unbounded}, @@ -12,7 +14,6 @@ use net::async_net::{UnixListener, UnixStream}; use schemars::JsonSchema; use serde::de::DeserializeOwned; use serde_json::{json, value::RawValue}; -use smol::stream::StreamExt; use std::{ any::TypeId, cell::RefCell, @@ -201,7 +202,7 @@ impl McpServer { handlers: Rc>>, cx: &mut AsyncApp, ) { - let (read, write) = smol::io::split(stream); + let (read, write) = stream.split(); let (incoming_tx, mut incoming_rx) = unbounded(); let (outgoing_tx, outgoing_rx) = unbounded(); diff --git a/crates/context_server/src/oauth.rs b/crates/context_server/src/oauth.rs index 1a314de2fc..de6b7d50e8 100644 --- a/crates/context_server/src/oauth.rs +++ b/crates/context_server/src/oauth.rs @@ -1962,7 +1962,7 @@ mod tests { #[test] fn test_fetch_protected_resource_metadata() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2008,7 +2008,7 @@ mod tests { #[test] fn test_fetch_protected_resource_metadata_prefers_www_authenticate_url() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2046,7 +2046,7 @@ mod tests { #[test] fn test_fetch_protected_resource_metadata_rejects_cross_origin_url() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2089,7 +2089,7 @@ mod tests { #[test] fn test_fetch_auth_server_metadata() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2134,7 +2134,7 @@ mod tests { #[test] fn test_fetch_auth_server_metadata_falls_back_to_oidc() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2167,7 +2167,7 @@ mod tests { #[test] fn test_fetch_auth_server_metadata_rejects_issuer_mismatch() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2205,7 +2205,7 @@ mod tests { #[test] fn test_full_discover_with_cimd() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2257,7 +2257,7 @@ mod tests { #[test] fn test_full_discover_with_dcr_fallback() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2320,7 +2320,7 @@ mod tests { #[test] fn test_discover_fails_without_pkce_support() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2370,7 +2370,7 @@ mod tests { #[test] fn test_exchange_code_success() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2420,7 +2420,7 @@ mod tests { #[test] fn test_refresh_tokens_success() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|req| { Box::pin(async move { let uri = req.uri().to_string(); @@ -2459,7 +2459,7 @@ mod tests { #[test] fn test_exchange_code_failure() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|_req| { Box::pin(async move { json_response(400, r#"{"error": "invalid_grant"}"#) }) }); @@ -2494,7 +2494,7 @@ mod tests { #[test] fn test_perform_dcr() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|_req| { Box::pin(async move { json_response( @@ -2522,7 +2522,7 @@ mod tests { #[test] fn test_perform_dcr_failure() { - smol::block_on(async { + gpui::block_on(async { let client = make_fake_http_client(|_req| { Box::pin( async move { json_response(403, r#"{"error": "registration_not_allowed"}"#) }, @@ -2693,7 +2693,7 @@ mod tests { #[test] fn test_mcp_oauth_provider_refresh_without_refresh_token_returns_false() { - smol::block_on(async { + gpui::block_on(async { let session = make_test_session("token", None, None); let provider = McpOAuthTokenProvider::new( session, @@ -2710,7 +2710,7 @@ mod tests { #[test] fn test_mcp_oauth_provider_refresh_updates_session_and_notifies_channel() { - smol::block_on(async { + gpui::block_on(async { let session = make_test_session("old-access", Some("my-refresh-token"), None); let (tx, mut rx) = futures::channel::mpsc::unbounded(); @@ -2744,7 +2744,7 @@ mod tests { #[test] fn test_mcp_oauth_provider_refresh_preserves_old_refresh_token_when_server_omits_it() { - smol::block_on(async { + gpui::block_on(async { let session = make_test_session("old-access", Some("original-refresh"), None); let (tx, mut rx) = futures::channel::mpsc::unbounded(); @@ -2776,7 +2776,7 @@ mod tests { #[test] fn test_mcp_oauth_provider_refresh_returns_false_on_http_error() { - smol::block_on(async { + gpui::block_on(async { let session = make_test_session("old-access", Some("my-refresh"), None); let http_client = make_fake_http_client(|_req| { diff --git a/crates/context_server/src/transport/http.rs b/crates/context_server/src/transport/http.rs index 3e002983b5..47e31c7abc 100644 --- a/crates/context_server/src/transport/http.rs +++ b/crates/context_server/src/transport/http.rs @@ -5,7 +5,6 @@ use futures::{Stream, StreamExt}; use gpui::BackgroundExecutor; use http_client::{AsyncBody, HttpClient, Request, Response, http::Method}; use parking_lot::Mutex as SyncMutex; -use smol::channel; use std::{pin::Pin, sync::Arc}; use crate::oauth::{self, OAuthTokenProvider, WwwAuthenticate}; @@ -43,10 +42,10 @@ pub struct HttpTransport { endpoint: String, session_id: Arc>>, executor: BackgroundExecutor, - response_tx: channel::Sender, - response_rx: channel::Receiver, - error_tx: channel::Sender, - error_rx: channel::Receiver, + response_tx: async_channel::Sender, + response_rx: async_channel::Receiver, + error_tx: async_channel::Sender, + error_rx: async_channel::Receiver, /// Static headers to include in every request (e.g. from server config). headers: HashMap, /// When set, the transport attaches `Authorization: Bearer` headers and @@ -71,8 +70,8 @@ impl HttpTransport { executor: BackgroundExecutor, token_provider: Option>, ) -> Self { - let (response_tx, response_rx) = channel::unbounded(); - let (error_tx, error_rx) = channel::unbounded(); + let (response_tx, response_rx) = async_channel::unbounded(); + let (error_tx, error_rx) = async_channel::unbounded(); Self { http_client, @@ -241,62 +240,63 @@ impl HttpTransport { let error_tx = self.error_tx.clone(); // Spawn a task to handle the SSE stream - smol::spawn(async move { - let reader = futures::io::BufReader::new(response.body_mut()); - let mut lines = futures::AsyncBufReadExt::lines(reader); + self.executor + .spawn(async move { + let reader = futures::io::BufReader::new(response.body_mut()); + let mut lines = futures::AsyncBufReadExt::lines(reader); - let mut data_buffer = Vec::new(); - let mut in_message = false; + let mut data_buffer = Vec::new(); + let mut in_message = false; - while let Some(line_result) = lines.next().await { - match line_result { - Ok(line) => { - if line.is_empty() { - // Empty line signals end of event - if !data_buffer.is_empty() { - let message = data_buffer.join("\n"); + while let Some(line_result) = lines.next().await { + match line_result { + Ok(line) => { + if line.is_empty() { + // Empty line signals end of event + if !data_buffer.is_empty() { + let message = data_buffer.join("\n"); - // Filter out ping messages and empty data - if !message.trim().is_empty() && message != "ping" { - if let Err(e) = response_tx.send(message).await { - log::error!("Failed to send SSE message: {}", e); - break; + // Filter out ping messages and empty data + if !message.trim().is_empty() && message != "ping" { + if let Err(e) = response_tx.send(message).await { + log::error!("Failed to send SSE message: {}", e); + break; + } } + data_buffer.clear(); } - data_buffer.clear(); - } - in_message = false; - } else if let Some(data) = line.strip_prefix("data: ") { - // Handle data lines - let data = data.trim(); - if !data.is_empty() { - // Check if this is a ping message - if data == "ping" { - log::trace!("Received SSE ping"); - continue; + in_message = false; + } else if let Some(data) = line.strip_prefix("data: ") { + // Handle data lines + let data = data.trim(); + if !data.is_empty() { + // Check if this is a ping message + if data == "ping" { + log::trace!("Received SSE ping"); + continue; + } + data_buffer.push(data.to_string()); + in_message = true; } - data_buffer.push(data.to_string()); - in_message = true; + } else if line.starts_with("event:") + || line.starts_with("id:") + || line.starts_with("retry:") + { + // Ignore other SSE fields + continue; + } else if in_message { + // Continuation of data + data_buffer.push(line); } - } else if line.starts_with("event:") - || line.starts_with("id:") - || line.starts_with("retry:") - { - // Ignore other SSE fields - continue; - } else if in_message { - // Continuation of data - data_buffer.push(line); + } + Err(e) => { + let _ = error_tx.send(format!("SSE stream error: {}", e)).await; + break; } } - Err(e) => { - let _ = error_tx.send(format!("SSE stream error: {}", e)).await; - break; - } } - } - }) - .detach(); + }) + .detach(); Ok(()) } diff --git a/crates/context_server/src/transport/stdio_transport.rs b/crates/context_server/src/transport/stdio_transport.rs index 0b5525a3a5..4bf4b77cda 100644 --- a/crates/context_server/src/transport/stdio_transport.rs +++ b/crates/context_server/src/transport/stdio_transport.rs @@ -2,14 +2,13 @@ use std::path::PathBuf; use std::pin::Pin; use anyhow::{Context as _, Result}; +use async_process::Child; use async_trait::async_trait; use futures::io::{BufReader, BufWriter}; use futures::{ AsyncBufReadExt as _, AsyncRead, AsyncWrite, AsyncWriteExt as _, Stream, StreamExt as _, }; use gpui::AsyncApp; -use smol::channel; -use smol::process::Child; use util::TryFutureExt as _; use util::shell::Shell; use util::shell_builder::ShellBuilder; @@ -18,9 +17,9 @@ use crate::client::ModelContextServerBinary; use crate::transport::Transport; pub struct StdioTransport { - stdout_sender: channel::Sender, - stdin_receiver: channel::Receiver, - stderr_receiver: channel::Receiver, + stdout_sender: async_channel::Sender, + stdin_receiver: async_channel::Receiver, + stderr_receiver: async_channel::Receiver, server: Child, } @@ -53,9 +52,9 @@ impl StdioTransport { let stdout = server.stdout.take().unwrap(); let stderr = server.stderr.take().unwrap(); - let (stdin_sender, stdin_receiver) = channel::unbounded::(); - let (stdout_sender, stdout_receiver) = channel::unbounded::(); - let (stderr_sender, stderr_receiver) = channel::unbounded::(); + let (stdin_sender, stdin_receiver) = async_channel::unbounded::(); + let (stdout_sender, stdout_receiver) = async_channel::unbounded::(); + let (stderr_sender, stderr_receiver) = async_channel::unbounded::(); cx.spawn(async move |_| Self::handle_output(stdin, stdout_receiver).log_err().await) .detach(); @@ -74,7 +73,7 @@ impl StdioTransport { }) } - async fn handle_input(stdin: Stdout, inbound_rx: channel::Sender) + async fn handle_input(stdin: Stdout, inbound_rx: async_channel::Sender) where Stdout: AsyncRead + Unpin + Send + 'static, { @@ -93,7 +92,7 @@ impl StdioTransport { async fn handle_output( stdin: Stdin, - outbound_rx: channel::Receiver, + outbound_rx: async_channel::Receiver, ) -> Result<()> where Stdin: AsyncWrite + Unpin + Send + 'static, @@ -110,7 +109,7 @@ impl StdioTransport { Ok(()) } - async fn handle_err(stderr: Stderr, stderr_tx: channel::Sender) + async fn handle_err(stderr: Stderr, stderr_tx: async_channel::Sender) where Stderr: AsyncRead + Unpin + Send + 'static, { diff --git a/crates/crashes/Cargo.toml b/crates/crashes/Cargo.toml index 2c13dc83c5..6886e5808a 100644 --- a/crates/crashes/Cargo.toml +++ b/crates/crashes/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true license = "GPL-3.0-or-later" [dependencies] +async-process.workspace = true cfg-if.workspace = true crash-handler.workspace = true futures.workspace = true @@ -14,7 +15,6 @@ minidumper.workspace = true parking_lot.workspace = true paths.workspace = true release_channel.workspace = true -smol.workspace = true serde.workspace = true serde_json.workspace = true system_specs.workspace = true diff --git a/crates/crashes/src/crashes.rs b/crates/crashes/src/crashes.rs index 9f18088b0e..9abe7eb8b4 100644 --- a/crates/crashes/src/crashes.rs +++ b/crates/crashes/src/crashes.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use std::mem; #[cfg(not(target_os = "windows"))] -use smol::process::Command; +use async_process::Command; use system_specs::GpuSpecs; #[cfg(target_os = "macos")] @@ -57,7 +57,11 @@ fn should_install_crash_handler() -> bool { /// The synchronous portion (signal handlers, panic hook) runs inline. /// The async keepalive task is passed to `spawn` so the caller decides /// which executor to schedule it on. -pub fn init(crash_init: InitCrashHandler, spawn: impl FnOnce(BoxFuture<'static, ()>)) { +pub fn init + Send + Sync + 'static>( + crash_init: InitCrashHandler, + spawn: impl FnOnce(BoxFuture<'static, ()>), + wait_timer: impl (Fn(Duration) -> F) + Send + Sync + 'static, +) { if !should_install_crash_handler() { let old_hook = panic::take_hook(); panic::set_hook(Box::new(move |info| { @@ -102,12 +106,18 @@ pub fn init(crash_init: InitCrashHandler, spawn: impl FnOnce(BoxFuture<'static, info!("crash signal handlers installed"); - spawn(Box::pin(connect_and_keepalive(crash_init, handler))); + spawn(Box::pin(connect_and_keepalive( + crash_init, handler, wait_timer, + ))); } /// Spawn the crash-handler subprocess, connect the IPC client, and run the /// keepalive ping loop. Called on a background executor by [`init`]. -async fn connect_and_keepalive(crash_init: InitCrashHandler, handler: CrashHandler) { +async fn connect_and_keepalive + Send + Sync + 'static>( + crash_init: InitCrashHandler, + handler: CrashHandler, + wait_timer: impl (Fn(Duration) -> F) + Send + Sync + 'static, +) { let exe = env::current_exe().expect("unable to find ourselves"); let zed_pid = process::id(); let socket_name = paths::temp_dir().join(format!("zed-crash-handler-{zed_pid}")); @@ -134,9 +144,7 @@ async fn connect_and_keepalive(crash_init: InitCrashHandler, handler: CrashHandl break; } elapsed += retry_frequency; - // Crash reporting is called outside of gpui in the remote server right now - #[allow(clippy::disallowed_methods)] - smol::Timer::after(retry_frequency).await; + wait_timer(retry_frequency).await; } let client = maybe_client.unwrap(); let client = Arc::new(client); @@ -157,9 +165,7 @@ async fn connect_and_keepalive(crash_init: InitCrashHandler, handler: CrashHandl loop { client.ping().ok(); - // Crash reporting is called outside of gpui in the remote server right now - #[allow(clippy::disallowed_methods)] - smol::Timer::after(Duration::from_secs(10)).await; + wait_timer(Duration::from_secs(10)).await; } } diff --git a/crates/db/Cargo.toml b/crates/db/Cargo.toml index 2fc790181a..36e914715b 100644 --- a/crates/db/Cargo.toml +++ b/crates/db/Cargo.toml @@ -23,7 +23,6 @@ inventory.workspace = true log.workspace = true paths.workspace = true release_channel.workspace = true -smol.workspace = true sqlez.workspace = true sqlez_macros.workspace = true util.workspace = true diff --git a/crates/db/src/db.rs b/crates/db/src/db.rs index da418b26e8..7cb4def94f 100644 --- a/crates/db/src/db.rs +++ b/crates/db/src/db.rs @@ -9,7 +9,6 @@ use gpui::{App, AppContext, Global}; pub use indoc::indoc; pub use inventory; pub use paths::database_dir; -pub use smol; pub use sqlez; pub use sqlez_macros; pub use uuid; @@ -19,6 +18,7 @@ use release_channel::ReleaseChannel; use sqlez::domain::Migrator; use sqlez::thread_safe_connection::ThreadSafeConnection; use sqlez_macros::sql; +use std::fs::create_dir_all; use std::future::Future; use std::path::{Path, PathBuf}; use std::sync::atomic::AtomicBool; @@ -62,7 +62,7 @@ impl AppDatabase { /// migrations in dependency order. pub fn new() -> Self { let db_dir = database_dir(); - let connection = smol::block_on(open_db::(db_dir, *RELEASE_CHANNEL)); + let connection = gpui::block_on(open_db::(db_dir, *RELEASE_CHANNEL)); Self(connection) } @@ -71,7 +71,7 @@ impl AppDatabase { #[cfg(any(test, feature = "test-support"))] pub fn test_new() -> Self { let name = format!("test-db-{}", uuid::Uuid::new_v4()); - let connection = smol::block_on(open_test_db::(&name)); + let connection = gpui::block_on(open_test_db::(&name)); Self(connection) } @@ -183,8 +183,7 @@ pub async fn open_db( let connection = maybe!(async { if let Some(parent) = db_path.parent() { - smol::fs::create_dir_all(parent) - .await + create_dir_all(parent) .context("Could not create db directory") .log_err()?; } @@ -397,7 +396,7 @@ mod tests { for _ in 0..10 { let tmp_path = tempdir.path().to_path_buf(); let guard = thread::spawn(move || { - let good_db = smol::block_on(open_db::( + let good_db = gpui::block_on(open_db::( tmp_path.as_path(), release_channel::ReleaseChannel::Dev, )); diff --git a/crates/db/src/kvp.rs b/crates/db/src/kvp.rs index 2dc34e5b02..a8c4d4dfe5 100644 --- a/crates/db/src/kvp.rs +++ b/crates/db/src/kvp.rs @@ -243,7 +243,7 @@ impl std::ops::Deref for GlobalKeyValueStore { static GLOBAL_KEY_VALUE_STORE: std::sync::LazyLock = std::sync::LazyLock::new(|| { let db_dir = crate::database_dir(); - GlobalKeyValueStore(smol::block_on(crate::open_db::( + GlobalKeyValueStore(gpui::block_on(crate::open_db::( db_dir, crate::GlobalDbScope, ))) diff --git a/crates/edit_prediction_cli/src/main.rs b/crates/edit_prediction_cli/src/main.rs index b4951ae9d9..0ab16690e6 100644 --- a/crates/edit_prediction_cli/src/main.rs +++ b/crates/edit_prediction_cli/src/main.rs @@ -988,7 +988,7 @@ fn main() { match &command { Command::ImportBatch(import_args) => { - smol::block_on(async { + gpui::block_on(async { match import_args.provider { BatchProvider::Anthropic => { let client = anthropic_client::AnthropicClient::batch(&paths::LLM_CACHE_DB) @@ -1047,7 +1047,7 @@ fn main() { output_dir, fresh: synth_args.fresh, }; - smol::block_on(async { + gpui::block_on(async { if let Err(e) = run_synthesize(config).await { eprintln!("Error: {:?}", e); std::process::exit(1); diff --git a/crates/editor/Cargo.toml b/crates/editor/Cargo.toml index 1b2e32f198..e97cc68c2f 100644 --- a/crates/editor/Cargo.toml +++ b/crates/editor/Cargo.toml @@ -46,6 +46,7 @@ emojis.workspace = true feature_flags.workspace = true file_icons.workspace = true futures.workspace = true +futures-lite.workspace = true fuzzy.workspace = true fs.workspace = true git.workspace = true @@ -75,7 +76,6 @@ serde.workspace = true serde_json.workspace = true settings.workspace = true smallvec.workspace = true -smol.workspace = true snippet.workspace = true sum_tree.workspace = true task.workspace = true diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index d00376fc02..552eca261e 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -2582,9 +2582,9 @@ pub mod tests { }; use lsp::LanguageServerId; + use futures::stream::StreamExt; use rand::{Rng, prelude::*}; use settings::{SettingsContent, SettingsStore}; - use smol::stream::StreamExt; use std::{env, sync::Arc}; use text::PointUtf16; use theme::{LoadThemes, SyntaxTheme}; diff --git a/crates/editor/src/display_map/wrap_map.rs b/crates/editor/src/display_map/wrap_map.rs index 4ff11b1ef6..44a4689b28 100644 --- a/crates/editor/src/display_map/wrap_map.rs +++ b/crates/editor/src/display_map/wrap_map.rs @@ -4,10 +4,11 @@ use super::{ fold_map::{Chunk, FoldRows}, tab_map::{self, TabEdit, TabPoint, TabSnapshot}, }; + +use futures_lite::future::yield_now; use gpui::{App, AppContext as _, Context, Entity, Font, LineWrapper, Pixels, Task}; use language::{LanguageAwareStyling, Point}; use multi_buffer::{MultiBufferSnapshot, RowInfo}; -use smol::future::yield_now; use std::{cmp, collections::VecDeque, mem, ops::Range, sync::LazyLock, time::Duration}; use sum_tree::{Bias, Cursor, Dimensions, SumTree}; use text::Patch; @@ -205,7 +206,7 @@ impl WrapMap { }]; if total_rows < WRAP_YIELD_ROW_INTERVAL { - let edits = smol::block_on(new_snapshot.update( + let edits = gpui::block_on(new_snapshot.update( tab_snapshot, &tab_edits, wrap_width, @@ -299,7 +300,7 @@ impl WrapMap { < WRAP_YIELD_ROW_INTERVAL && let Some((tab_snapshot, tab_edits)) = pending_edits.pop_back() { - let wrap_edits = smol::block_on(snapshot.update( + let wrap_edits = gpui::block_on(snapshot.update( tab_snapshot, &tab_edits, wrap_width, @@ -1357,10 +1358,10 @@ mod tests { display_map::{fold_map::FoldMap, inlay_map::InlayMap, tab_map::TabMap}, test::test_font, }; + use futures::stream::StreamExt; use gpui::{LineFragment, px, test::observe}; use rand::prelude::*; use settings::SettingsStore; - use smol::stream::StreamExt; use std::{cmp, env, num::NonZeroU32}; use text::Rope; use theme::LoadThemes; diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 90d57d4787..24fdce51ba 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -1204,13 +1204,13 @@ mod tests { test::editor_lsp_test_context::EditorLspTestContext, }; use collections::BTreeSet; + use futures::stream::StreamExt; use gpui::App; use indoc::indoc; use markdown::parser::MarkdownEvent; use project::InlayId; use settings::InlayHintSettingsContent; use settings::{DelayMs, SettingsStore}; - use smol::stream::StreamExt; use std::sync::atomic; use std::sync::atomic::AtomicUsize; use text::Bias; diff --git a/crates/editor/src/lsp_ext.rs b/crates/editor/src/lsp_ext.rs index 6f9f94bc72..60f0dd305e 100644 --- a/crates/editor/src/lsp_ext.rs +++ b/crates/editor/src/lsp_ext.rs @@ -3,6 +3,7 @@ use std::time::Duration; use crate::Editor; use collections::{HashMap, HashSet}; +use futures_lite::FutureExt as _; use gpui::AsyncApp; use gpui::{App, Entity, Task}; use language::Buffer; @@ -14,7 +15,6 @@ use project::LocationLink; use project::Project; use project::TaskSourceKind; use project::lsp_store::lsp_ext_command::GetLspRunnables; -use smol::future::FutureExt as _; use task::ResolvedTask; use task::TaskContext; use text::BufferId; diff --git a/crates/editor/src/test/editor_lsp_test_context.rs b/crates/editor/src/test/editor_lsp_test_context.rs index d1e5270d6c..854a800d71 100644 --- a/crates/editor/src/test/editor_lsp_test_context.rs +++ b/crates/editor/src/test/editor_lsp_test_context.rs @@ -13,6 +13,7 @@ use serde_json::json; use crate::{Editor, ToPoint}; use collections::HashSet; use futures::Future; +use futures::stream::StreamExt; use gpui::{Context, Entity, Focusable as _, VisualTestContext, Window}; use indoc::indoc; use language::{ @@ -21,7 +22,6 @@ use language::{ }; use lsp::{notification, request}; use project::Project; -use smol::stream::StreamExt; use workspace::{AppState, MultiWorkspace, Workspace, WorkspaceHandle}; use super::editor_test_context::{AssertionContextManager, EditorTestContext}; diff --git a/crates/fs/Cargo.toml b/crates/fs/Cargo.toml index eefe2717f2..bf47e0ee13 100644 --- a/crates/fs/Cargo.toml +++ b/crates/fs/Cargo.toml @@ -19,6 +19,7 @@ path = "tests/integration/main.rs" [dependencies] anyhow.workspace = true +async-channel.workspace = true async-tar.workspace = true async-trait.workspace = true collections.workspace = true diff --git a/crates/fs/src/fake_git_repo.rs b/crates/fs/src/fake_git_repo.rs index 3b34d54a6a..309b6a84a6 100644 --- a/crates/fs/src/fake_git_repo.rs +++ b/crates/fs/src/fake_git_repo.rs @@ -2,7 +2,9 @@ use std::path::Path; use crate::{FakeFs, FakeFsEntry, Fs, RemoveOptions, RenameOptions}; use anyhow::{Context as _, Result, bail}; +use async_channel::Sender; use collections::{HashMap, HashSet}; +use futures::FutureExt as _; use futures::future::{self, BoxFuture, join_all}; use git::repository::GitCommitTemplate; use git::{ @@ -24,7 +26,6 @@ use gpui::{AsyncApp, BackgroundExecutor, SharedString, Task}; use ignore::gitignore::GitignoreBuilder; use parking_lot::Mutex; use rope::Rope; -use smol::{channel::Sender, future::FutureExt as _}; use std::{path::PathBuf, sync::Arc, sync::atomic::AtomicBool}; use text::LineEnding; use util::{paths::PathStyle, rel_path::RelPath}; @@ -56,7 +57,7 @@ pub enum FakeCommitDataEntry { #[derive(Debug, Clone)] pub struct FakeGitRepositoryState { pub commit_history: Vec, - pub event_emitter: smol::channel::Sender, + pub event_emitter: async_channel::Sender, pub unmerged_paths: HashMap, pub head_contents: HashMap, pub index_contents: HashMap, @@ -78,7 +79,7 @@ pub struct FakeGitRepositoryState { } impl FakeGitRepositoryState { - pub fn new(event_emitter: smol::channel::Sender) -> Self { + pub fn new(event_emitter: async_channel::Sender) -> Self { FakeGitRepositoryState { event_emitter, head_contents: Default::default(), diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index 709b037c05..5b505d4d7a 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -1200,7 +1200,7 @@ impl Fs for RealFs { let use_poll = requires_poll_watcher(path); let watch_path = effective_watch_path(path); - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); let pending_paths: Arc>> = Default::default(); let mode = if use_poll { @@ -1449,8 +1449,8 @@ struct FakeFsState { root: FakeFsEntry, next_inode: u64, next_mtime: SystemTime, - git_event_tx: smol::channel::Sender, - event_txs: Vec<(PathBuf, smol::channel::Sender>)>, + git_event_tx: async_channel::Sender, + event_txs: Vec<(PathBuf, async_channel::Sender>)>, events_paused: bool, buffered_events: Vec, metadata_call_count: usize, @@ -1720,7 +1720,7 @@ impl FakeFs { const SYSTEMTIME_INTERVAL: Duration = Duration::from_nanos(100); pub fn new(executor: gpui::BackgroundExecutor) -> Arc { - let (tx, rx) = smol::channel::bounded::(10); + let (tx, rx) = async_channel::bounded::(10); let this = Arc::new_cyclic(|this| Self { this: this.clone(), @@ -2714,7 +2714,7 @@ impl FakeFsEntry { #[cfg(feature = "test-support")] struct FakeWatcher { - tx: smol::channel::Sender>, + tx: async_channel::Sender>, original_path: PathBuf, fs_state: Arc>, prefixes: Mutex>, @@ -3183,7 +3183,7 @@ impl Fs for FakeFs { Arc, ) { self.simulate_random_delay().await; - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); let path = path.to_path_buf(); self.state.lock().event_txs.push((path.clone(), tx.clone())); let executor = self.executor.clone(); diff --git a/crates/fs/src/fs_watcher.rs b/crates/fs/src/fs_watcher.rs index 909424558b..6db36992de 100644 --- a/crates/fs/src/fs_watcher.rs +++ b/crates/fs/src/fs_watcher.rs @@ -19,7 +19,7 @@ pub enum WatcherMode { } pub struct FsWatcher { - tx: smol::channel::Sender<()>, + tx: async_channel::Sender<()>, pending_path_events: Arc>>, registrations: Mutex, WatcherRegistrationId>>, mode: WatcherMode, @@ -27,7 +27,7 @@ pub struct FsWatcher { impl FsWatcher { pub fn new( - tx: smol::channel::Sender<()>, + tx: async_channel::Sender<()>, pending_path_events: Arc>>, mode: WatcherMode, ) -> Self { diff --git a/crates/fs/tests/integration/fs.rs b/crates/fs/tests/integration/fs.rs index 97ec90bea0..b27e4113fd 100644 --- a/crates/fs/tests/integration/fs.rs +++ b/crates/fs/tests/integration/fs.rs @@ -439,7 +439,7 @@ async fn test_realfs_atomic_write(executor: BackgroundExecutor) { // drop(file); // We still hold the file handle here let content = std::fs::read_to_string(&file_to_be_replaced).unwrap(); assert_eq!(content, "Hello"); - smol::block_on(fs.atomic_write(file_to_be_replaced.clone(), "World".into())).unwrap(); + gpui::block_on(fs.atomic_write(file_to_be_replaced.clone(), "World".into())).unwrap(); let content = std::fs::read_to_string(&file_to_be_replaced).unwrap(); assert_eq!(content, "World"); } @@ -449,7 +449,7 @@ async fn test_realfs_atomic_write_non_existing_file(executor: BackgroundExecutor let fs = RealFs::new(None, executor); let temp_dir = TempDir::new().unwrap(); let file_to_be_replaced = temp_dir.path().join("file.txt"); - smol::block_on(fs.atomic_write(file_to_be_replaced.clone(), "Hello".into())).unwrap(); + gpui::block_on(fs.atomic_write(file_to_be_replaced.clone(), "Hello".into())).unwrap(); let content = std::fs::read_to_string(&file_to_be_replaced).unwrap(); assert_eq!(content, "Hello"); } @@ -594,7 +594,7 @@ async fn test_realfs_broken_symlink_metadata(executor: BackgroundExecutor) { let path = tempdir.path(); let fs = RealFs::new(None, executor); let symlink_path = path.join("symlink"); - smol::block_on(fs.create_symlink(&symlink_path, PathBuf::from("file_a.txt"))).unwrap(); + gpui::block_on(fs.create_symlink(&symlink_path, PathBuf::from("file_a.txt"))).unwrap(); let metadata = fs .metadata(&symlink_path) .await @@ -614,7 +614,7 @@ async fn test_realfs_symlink_loop_metadata(executor: BackgroundExecutor) { let path = tempdir.path(); let fs = RealFs::new(None, executor); let symlink_path = path.join("symlink"); - smol::block_on(fs.create_symlink(&symlink_path, PathBuf::from("symlink"))).unwrap(); + gpui::block_on(fs.create_symlink(&symlink_path, PathBuf::from("symlink"))).unwrap(); let metadata = fs .metadata(&symlink_path) .await diff --git a/crates/git/Cargo.toml b/crates/git/Cargo.toml index 23a937bf1f..a96d8cbe0a 100644 --- a/crates/git/Cargo.toml +++ b/crates/git/Cargo.toml @@ -32,6 +32,7 @@ rope.workspace = true schemars.workspace = true serde.workspace = true smallvec.workspace = true +async-channel.workspace = true smol.workspace = true sum_tree.workspace = true text.workspace = true diff --git a/crates/git/src/repository.rs b/crates/git/src/repository.rs index c67e8c1e65..c436ffbf6d 100644 --- a/crates/git/src/repository.rs +++ b/crates/git/src/repository.rs @@ -3,6 +3,7 @@ use crate::stash::GitStash; use crate::status::{DiffTreeType, GitStatus, StatusCode, TreeDiff}; use crate::{Oid, RunHook, SHORT_SHA_LENGTH}; use anyhow::{Context as _, Result, anyhow, bail}; +use async_channel::Sender; use collections::HashMap; use futures::channel::oneshot; use futures::future::BoxFuture; @@ -15,7 +16,6 @@ use rope::Rope; use schemars::JsonSchema; use serde::Deserialize; use smallvec::SmallVec; -use smol::channel::Sender; use smol::io::{AsyncBufReadExt, AsyncReadExt, BufReader}; use text::LineEnding; @@ -123,7 +123,7 @@ struct CommitDataRequest { } pub struct CommitDataReader { - request_tx: smol::channel::Sender, + request_tx: async_channel::Sender, _task: Task<()>, } @@ -3068,7 +3068,7 @@ impl GitRepository for RealGitRepository { fn commit_data_reader(&self) -> Result { let git_binary = self.git_binary()?; - let (request_tx, request_rx) = smol::channel::bounded::(64); + let (request_tx, request_rx) = async_channel::bounded::(64); let task = self.executor.spawn(async move { if let Err(error) = run_commit_data_reader(git_binary, request_rx).await { @@ -3094,7 +3094,7 @@ impl GitRepository for RealGitRepository { async fn run_commit_data_reader( git: GitBinary, - request_rx: smol::channel::Receiver, + request_rx: async_channel::Receiver, ) -> Result<()> { let mut process = git .build_command(&["cat-file", "--batch"]) diff --git a/crates/git_graph/Cargo.toml b/crates/git_graph/Cargo.toml index 55c054b138..7a8f78b46e 100644 --- a/crates/git_graph/Cargo.toml +++ b/crates/git_graph/Cargo.toml @@ -21,6 +21,7 @@ test-support = [ [dependencies] anyhow.workspace = true +async-channel.workspace = true collections.workspace = true db.workspace = true editor.workspace = true @@ -34,7 +35,6 @@ project_panel.workspace = true search.workspace = true settings.workspace = true smallvec.workspace = true -smol.workspace = true theme.workspace = true theme_settings.workspace = true time.workspace = true diff --git a/crates/git_graph/src/git_graph.rs b/crates/git_graph/src/git_graph.rs index 65b0894c2e..e0f4afff46 100644 --- a/crates/git_graph/src/git_graph.rs +++ b/crates/git_graph/src/git_graph.rs @@ -1542,7 +1542,7 @@ impl GitGraph { return; } - let (request_tx, request_rx) = smol::channel::unbounded::(); + let (request_tx, request_rx) = async_channel::unbounded::(); repo.update(cx, |repo, cx| { repo.search_commits( diff --git a/crates/git_ui/Cargo.toml b/crates/git_ui/Cargo.toml index 1e2d7f79dd..19242ee3f0 100644 --- a/crates/git_ui/Cargo.toml +++ b/crates/git_ui/Cargo.toml @@ -29,6 +29,7 @@ editor.workspace = true file_icons.workspace = true fs.workspace = true futures.workspace = true +futures-lite.workspace = true fuzzy.workspace = true fuzzy_nucleo.workspace = true git.workspace = true @@ -55,7 +56,6 @@ serde.workspace = true serde_json.workspace = true settings.workspace = true smallvec.workspace = true -smol.workspace = true strum.workspace = true telemetry.workspace = true theme.workspace = true diff --git a/crates/git_ui/src/project_diff.rs b/crates/git_ui/src/project_diff.rs index 4a300a5257..67d9a96b2d 100644 --- a/crates/git_ui/src/project_diff.rs +++ b/crates/git_ui/src/project_diff.rs @@ -13,6 +13,7 @@ use editor::{ multibuffer_context_lines, scroll::Autoscroll, }; +use futures_lite::future::yield_now; use git::repository::DiffType; use git::{ @@ -33,7 +34,6 @@ use project::{ }, }; use settings::{Settings, SettingsStore}; -use smol::future::yield_now; use std::any::{Any, TypeId}; use std::sync::Arc; use theme::ActiveTheme; diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index dbb57f46ef..9f307f56b8 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -122,6 +122,8 @@ pub use util::{FutureExt, Timeout}; pub use view::*; pub use window::*; +pub use pollster::block_on; + /// The context trait, allows the different contexts in GPUI to be used /// interchangeably for certain operations. pub trait AppContext { diff --git a/crates/gpui/src/test.rs b/crates/gpui/src/test.rs index 2ee45f899c..9f22487133 100644 --- a/crates/gpui/src/test.rs +++ b/crates/gpui/src/test.rs @@ -207,7 +207,7 @@ pub fn observe(entity: &Entity, cx: &mut TestAppContext) -> Obser let (tx, rx) = async_channel::unbounded(); let _subscription = cx.update(|cx| { cx.observe(entity, move |_, _| { - let _ = pollster::block_on(tx.send(())); + let _ = gpui::block_on(tx.send(())); }) }); let rx = Box::pin(rx); diff --git a/crates/gpui_wgpu/src/wgpu_atlas.rs b/crates/gpui_wgpu/src/wgpu_atlas.rs index f3b9de1ca8..94b4b561c0 100644 --- a/crates/gpui_wgpu/src/wgpu_atlas.rs +++ b/crates/gpui_wgpu/src/wgpu_atlas.rs @@ -399,8 +399,8 @@ fn swizzle_upload_data(bytes: &[u8], format: wgpu::TextureFormat) -> Vec { #[cfg(all(test, not(target_family = "wasm")))] mod tests { use super::*; + use gpui::block_on; use gpui::{ImageId, RenderImageParams}; - use pollster::block_on; use std::sync::Arc; fn test_device_and_queue() -> anyhow::Result<(Arc, Arc)> { diff --git a/crates/gpui_wgpu/src/wgpu_context.rs b/crates/gpui_wgpu/src/wgpu_context.rs index 2662a9289d..80900311b2 100644 --- a/crates/gpui_wgpu/src/wgpu_context.rs +++ b/crates/gpui_wgpu/src/wgpu_context.rs @@ -44,7 +44,7 @@ impl WgpuContext { // Select an adapter by actually testing surface configuration with the real device. // This is the only reliable way to determine compatibility on hybrid GPU systems. let (adapter, device, queue, dual_source_blending, color_texture_format) = - pollster::block_on(Self::select_adapter_and_device( + gpui::block_on(Self::select_adapter_and_device( &instance, device_id_filter, surface, diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 1392ed63f6..b4d24765de 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -35,6 +35,7 @@ ec4rs.workspace = true encoding_rs.workspace = true fs.workspace = true futures.workspace = true +futures-lite.workspace = true fuzzy.workspace = true globset.workspace = true gpui.workspace = true @@ -55,7 +56,6 @@ serde_json.workspace = true settings.workspace = true shellexpand.workspace = true smallvec.workspace = true -smol.workspace = true streaming-iterator.workspace = true strsim.workspace = true sum_tree.workspace = true diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index e15568affc..ec3b4327e1 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -27,6 +27,7 @@ use collections::{HashMap, HashSet}; use encoding_rs::Encoding; use fs::MTime; use futures::channel::oneshot; +use futures_lite::future::yield_now; use gpui::{ App, AppContext as _, Context, Entity, EventEmitter, HighlightStyle, SharedString, StyledText, Task, TextStyle, @@ -36,7 +37,6 @@ use lsp::LanguageServerId; use parking_lot::Mutex; use settings::WorktreeId; use smallvec::SmallVec; -use smol::future::yield_now; use std::{ any::Any, borrow::Cow, diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index 9f4562bf54..a13678a27d 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -3,6 +3,7 @@ use crate::Buffer; use clock::ReplicaId; use collections::BTreeMap; use futures::FutureExt as _; +use futures_lite::future::yield_now; use gpui::{App, AppContext as _, BorrowAppContext, Entity}; use gpui::{HighlightStyle, TestAppContext}; use indoc::indoc; @@ -559,7 +560,7 @@ async fn test_normalize_whitespace(cx: &mut gpui::TestAppContext) { // Spawn a task to format the buffer's whitespace. // Pause so that the formatting task starts running. let format = buffer.update(cx, |buffer, cx| buffer.remove_trailing_whitespace(cx)); - smol::future::yield_now().await; + yield_now().await; // Edit the buffer while the normalization task is running. let version_before_edit = buffer.update(cx, |buffer, _| buffer.version()); diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index ea8a0c69a1..ef495d462b 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -37,6 +37,7 @@ use http_client::HttpClient; pub use language_core::highlight_map::{HighlightId, HighlightMap}; +use futures::future::FutureExt as _; pub use language_core::{ BlockCommentConfig, BracketPair, BracketPairConfig, BracketPairContent, BracketsConfig, BracketsPatternConfig, CodeLabel, CodeLabelBuilder, DebugVariablesConfig, DebuggerTextObject, @@ -61,7 +62,6 @@ use regex::Regex; use semver::Version; use serde_json::Value; use settings::WorktreeId; -use smol::future::FutureExt as _; use std::{ ffi::OsStr, fmt::Debug, diff --git a/crates/language/src/language_registry.rs b/crates/language/src/language_registry.rs index 8c115af27d..a9d5777be0 100644 --- a/crates/language/src/language_registry.rs +++ b/crates/language/src/language_registry.rs @@ -33,7 +33,7 @@ use sum_tree::Bias; use text::{Point, Rope}; use theme::Theme; use unicase::UniCase; -use util::{ResultExt, maybe, post_inc}; +use util::{maybe, post_inc}; pub struct LanguageRegistry { state: RwLock, @@ -1096,18 +1096,6 @@ impl LanguageRegistry { ) -> mpsc::UnboundedReceiver<(LanguageServerName, BinaryStatus)> { self.lsp_binary_status_tx.subscribe() } - - pub async fn delete_server_container(&self, name: LanguageServerName) { - log::info!("deleting server container"); - let Some(dir) = self.language_server_download_dir(&name) else { - return; - }; - - smol::fs::remove_dir_all(dir) - .await - .context("server container removal") - .log_err(); - } } impl LanguageRegistryState { diff --git a/crates/language_model_core/Cargo.toml b/crates/language_model_core/Cargo.toml index 7a6de00f3e..e9aa06400b 100644 --- a/crates/language_model_core/Cargo.toml +++ b/crates/language_model_core/Cargo.toml @@ -14,6 +14,7 @@ doctest = false [dependencies] anyhow.workspace = true +async-lock.workspace = true cloud_llm_client.workspace = true futures.workspace = true gpui_shared_string.workspace = true @@ -22,6 +23,5 @@ partial-json-fixer.workspace = true schemars.workspace = true serde.workspace = true serde_json.workspace = true -smol.workspace = true strum.workspace = true thiserror.workspace = true diff --git a/crates/language_model_core/src/rate_limiter.rs b/crates/language_model_core/src/rate_limiter.rs index 790be05ac0..28e92056f9 100644 --- a/crates/language_model_core/src/rate_limiter.rs +++ b/crates/language_model_core/src/rate_limiter.rs @@ -1,5 +1,5 @@ +use async_lock::{Semaphore, SemaphoreGuardArc}; use futures::Stream; -use smol::lock::{Semaphore, SemaphoreGuardArc}; use std::{ future::Future, pin::Pin, diff --git a/crates/language_models/Cargo.toml b/crates/language_models/Cargo.toml index f5828fa28d..c74526dba2 100644 --- a/crates/language_models/Cargo.toml +++ b/crates/language_models/Cargo.toml @@ -13,6 +13,7 @@ path = "src/language_models.rs" [dependencies] ai_onboarding.workspace = true +async-lock.workspace = true anthropic = { workspace = true, features = ["schemars"] } anyhow.workspace = true aws-config = { workspace = true, features = ["behavior-version-latest"] } @@ -55,7 +56,6 @@ schemars.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true strum.workspace = true tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } ui.workspace = true diff --git a/crates/language_models/src/provider/bedrock.rs b/crates/language_models/src/provider/bedrock.rs index 1069ad80fc..1a8d477192 100644 --- a/crates/language_models/src/provider/bedrock.rs +++ b/crates/language_models/src/provider/bedrock.rs @@ -2,6 +2,7 @@ use std::pin::Pin; use std::sync::Arc; use anyhow::{Context as _, Result, anyhow}; +use async_lock::OnceCell; use aws_config::stalled_stream_protection::StalledStreamProtectionConfig; use aws_config::{BehaviorVersion, Region}; use aws_credential_types::{Credentials, Token}; @@ -40,7 +41,6 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::Value; use settings::{BedrockAvailableModel as AvailableModel, Settings, SettingsStore}; -use smol::lock::OnceCell; use std::sync::LazyLock; use strum::{EnumIter, IntoEnumIterator, IntoStaticStr}; use ui::{ButtonLink, ConfiguredApiCard, Divider, List, ListBulletItem, prelude::*}; diff --git a/crates/language_models_cloud/Cargo.toml b/crates/language_models_cloud/Cargo.toml index de82fdfa62..e861a8dbf4 100644 --- a/crates/language_models_cloud/Cargo.toml +++ b/crates/language_models_cloud/Cargo.toml @@ -25,7 +25,6 @@ schemars.workspace = true semver.workspace = true serde.workspace = true serde_json.workspace = true -smol.workspace = true thiserror.workspace = true [dev-dependencies] diff --git a/crates/language_models_cloud/src/language_models_cloud.rs b/crates/language_models_cloud/src/language_models_cloud.rs index da5659bf50..9d04e100c0 100644 --- a/crates/language_models_cloud/src/language_models_cloud.rs +++ b/crates/language_models_cloud/src/language_models_cloud.rs @@ -7,8 +7,9 @@ use cloud_llm_client::{ SERVER_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, ZED_VERSION_HEADER_NAME, }; use futures::{ - AsyncBufReadExt, FutureExt, Stream, StreamExt, + AsyncBufReadExt, AsyncReadExt as _, FutureExt, Stream, StreamExt, future::BoxFuture, + io::BufReader, stream::{self, BoxStream}, }; use google_ai::GoogleModelMode; @@ -30,7 +31,6 @@ use language_model::{ use schemars::JsonSchema; use semver::Version; use serde::{Deserialize, Serialize, de::DeserializeOwned}; -use smol::io::{AsyncReadExt, BufReader}; use std::collections::VecDeque; use std::pin::Pin; use std::str::FromStr; diff --git a/crates/multi_buffer/Cargo.toml b/crates/multi_buffer/Cargo.toml index a06599999c..5dccddaba6 100644 --- a/crates/multi_buffer/Cargo.toml +++ b/crates/multi_buffer/Cargo.toml @@ -26,6 +26,7 @@ anyhow.workspace = true clock.workspace = true collections.workspace = true ctor.workspace = true +futures-lite.workspace = true buffer_diff.workspace = true gpui.workspace = true itertools.workspace = true @@ -34,7 +35,6 @@ log.workspace = true parking_lot.workspace = true rand.workspace = true rope.workspace = true -smol.workspace = true settings.workspace = true serde.workspace = true smallvec.workspace = true diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 59272d4b7c..8b7b1002d9 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -16,6 +16,7 @@ use buffer_diff::{ }; use clock::ReplicaId; use collections::{BTreeMap, Bound, HashMap, HashSet, IndexSet}; +use futures_lite::future::yield_now; use gpui::{App, Context, Entity, EventEmitter}; use itertools::Itertools; use language::{ @@ -33,7 +34,6 @@ use gpui::AppContext as _; use rope::DimensionPair; use settings::Settings; use smallvec::SmallVec; -use smol::future::yield_now; use std::{ any::type_name, borrow::Cow, diff --git a/crates/notifications/Cargo.toml b/crates/notifications/Cargo.toml index e0640c67cc..b03a658655 100644 --- a/crates/notifications/Cargo.toml +++ b/crates/notifications/Cargo.toml @@ -24,8 +24,8 @@ test-support = [ anyhow.workspace = true channel.workspace = true client.workspace = true +futures-lite.workspace = true component.workspace = true -db.workspace = true gpui.workspace = true rpc.workspace = true sum_tree.workspace = true diff --git a/crates/notifications/src/notification_store.rs b/crates/notifications/src/notification_store.rs index f30a018811..2e23b945a6 100644 --- a/crates/notifications/src/notification_store.rs +++ b/crates/notifications/src/notification_store.rs @@ -1,7 +1,7 @@ use anyhow::{Context as _, Result}; use channel::ChannelStore; use client::{ChannelId, Client, UserStore}; -use db::smol::stream::StreamExt; +use futures_lite::stream::StreamExt; use gpui::{App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Global, Task}; use rpc::{Notification, TypedEnvelope, proto}; use std::{ops::Range, sync::Arc}; diff --git a/crates/outline/Cargo.toml b/crates/outline/Cargo.toml index 2ce031bd46..84d596b761 100644 --- a/crates/outline/Cargo.toml +++ b/crates/outline/Cargo.toml @@ -20,7 +20,6 @@ language.workspace = true ordered-float.workspace = true picker.workspace = true settings.workspace = true -smol.workspace = true theme.workspace = true theme_settings.workspace = true ui.workspace = true @@ -40,3 +39,4 @@ rope.workspace = true serde_json.workspace = true settings = { workspace = true, features = ["test-support"] } workspace = { workspace = true, features = ["test-support"] } +futures.workspace = true diff --git a/crates/outline/src/outline.rs b/crates/outline/src/outline.rs index af5671632f..78c4d9c148 100644 --- a/crates/outline/src/outline.rs +++ b/crates/outline/src/outline.rs @@ -454,13 +454,13 @@ mod tests { use std::time::Duration; use super::*; + use futures::stream::StreamExt as _; use gpui::{TestAppContext, UpdateGlobal, VisualTestContext}; use indoc::indoc; use language::FakeLspAdapter; use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; - use smol::stream::StreamExt as _; use util::{path, rel_path::rel_path}; use workspace::{AppState, MultiWorkspace, Workspace}; diff --git a/crates/outline_panel/Cargo.toml b/crates/outline_panel/Cargo.toml index e88a026290..a5bbf3f7cc 100644 --- a/crates/outline_panel/Cargo.toml +++ b/crates/outline_panel/Cargo.toml @@ -14,11 +14,13 @@ doctest = false [dependencies] anyhow.workspace = true +async-channel.workspace = true collections.workspace = true db.workspace = true editor.workspace = true file_icons.workspace = true fuzzy.workspace = true +futures.workspace = true gpui.workspace = true itertools.workspace = true language.workspace = true @@ -31,7 +33,6 @@ serde.workspace = true serde_json.workspace = true settings.workspace = true smallvec.workspace = true -smol.workspace = true theme.workspace = true theme_settings.workspace = true ui.workspace = true diff --git a/crates/outline_panel/src/outline_panel.rs b/crates/outline_panel/src/outline_panel.rs index 4a30f2ff87..7b378c6fb8 100644 --- a/crates/outline_panel/src/outline_panel.rs +++ b/crates/outline_panel/src/outline_panel.rs @@ -46,7 +46,6 @@ use project::{File, Fs, GitEntry, GitTraversal, Project, ProjectItem}; use search::{BufferSearchBar, ProjectSearchView}; use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsStore}; -use smol::channel; use theme::SyntaxTheme; use theme_settings::ThemeSettings; use ui::{ @@ -156,7 +155,7 @@ struct SearchState { kind: SearchKind, query: String, matches: Vec<(Range, Arc>)>, - highlight_search_match_tx: channel::Sender, + highlight_search_match_tx: async_channel::Sender, _search_match_highlighter: Task<()>, _search_match_notify: Task<()>, } @@ -177,8 +176,8 @@ impl SearchState { window: &mut Window, cx: &mut Context, ) -> Self { - let (highlight_search_match_tx, highlight_search_match_rx) = channel::unbounded(); - let (notify_tx, notify_rx) = channel::unbounded::<()>(); + let (highlight_search_match_tx, highlight_search_match_rx) = async_channel::unbounded(); + let (notify_tx, notify_rx) = async_channel::unbounded::<()>(); Self { kind, query, @@ -5249,6 +5248,7 @@ impl GenerationState { #[cfg(test)] mod tests { use db::indoc; + use futures::stream::StreamExt as _; use gpui::{TestAppContext, UpdateGlobal, VisualTestContext, WindowHandle}; use language::{self, FakeLspAdapter, markdown_lang, rust_lang}; use pretty_assertions::assert_eq; @@ -5258,7 +5258,6 @@ mod tests { project_search::{self, perform_project_search}, }; use serde_json::json; - use smol::stream::StreamExt as _; use util::path; use workspace::{MultiWorkspace, OpenOptions, OpenVisible, ToolbarItemView}; diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 628e979aab..3a27bf4de6 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -38,6 +38,7 @@ aho-corasick.workspace = true anyhow.workspace = true askpass.workspace = true async-trait.workspace = true +async-channel.workspace = true base64.workspace = true buffer_diff.workspace = true circular-buffer.workspace = true diff --git a/crates/project/src/buffer_store.rs b/crates/project/src/buffer_store.rs index b5828d6068..2e234a7f93 100644 --- a/crates/project/src/buffer_store.rs +++ b/crates/project/src/buffer_store.rs @@ -46,7 +46,7 @@ pub struct BufferStore { #[derive(Default)] struct RemoteProjectSearchState { // List of ongoing project search chunks from our remote host. Used by the side issuing a search RPC request. - chunks: HashMap>, + chunks: HashMap>, // Monotonously-increasing handle to hand out to remote host in order to identify the project search result chunk. next_id: u64, // Used by the side running the actual search for match candidates to potentially cancel the search prematurely. @@ -1716,8 +1716,8 @@ impl BufferStore { pub(crate) fn register_project_search_result_handle( &mut self, - ) -> (u64, smol::channel::Receiver) { - let (tx, rx) = smol::channel::unbounded(); + ) -> (u64, async_channel::Receiver) { + let (tx, rx) = async_channel::unbounded(); let handle = util::post_inc(&mut self.project_search.next_id); let _old_entry = self.project_search.chunks.insert(handle, tx); debug_assert!(_old_entry.is_none()); diff --git a/crates/project/src/git_store.rs b/crates/project/src/git_store.rs index 22dd3123ed..71eaca61cf 100644 --- a/crates/project/src/git_store.rs +++ b/crates/project/src/git_store.rs @@ -310,7 +310,7 @@ pub struct JobInfo { struct CommitDataHandler { _task: Task<()>, - commit_data_request: smol::channel::Sender, + commit_data_request: async_channel::Sender, completion_senders: HashMap>>, pending_requests: HashSet, } @@ -4812,7 +4812,7 @@ impl Repository { &mut self, log_source: LogSource, search_args: SearchCommitArgs, - request_tx: smol::channel::Sender, + request_tx: async_channel::Sender, cx: &mut Context, ) { let repository_state = self.repository_state.clone(); @@ -4912,7 +4912,7 @@ impl Repository { cx: &mut AsyncApp, ) -> Result<(), SharedString> { let (request_tx, request_rx) = - smol::channel::unbounded::>>(); + async_channel::unbounded::>>(); let task = cx.background_executor().spawn({ let log_source = log_source.clone(); @@ -5029,8 +5029,8 @@ impl Repository { fn open_commit_data_handler(&self, cx: &Context) -> CommitDataHandler { let state = self.repository_state.clone(); - let (result_tx, result_rx) = smol::channel::bounded::<(Oid, CommitData)>(64); - let (request_tx, request_rx) = smol::channel::unbounded::(); + let (result_tx, result_rx) = async_channel::bounded::<(Oid, CommitData)>(64); + let (request_tx, request_rx) = async_channel::unbounded::(); let foreground_task = cx.spawn(async move |this, cx| { while let Ok((sha, commit_data)) = result_rx.recv().await { diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index a61eab730e..483f1252c4 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -1180,7 +1180,7 @@ impl LocalLspStore { async move { let actions = params.actions.unwrap_or_default(); let message = params.message.clone(); - let (tx, rx) = smol::channel::bounded::(1); + let (tx, rx) = async_channel::bounded::(1); let level = match params.typ { lsp::MessageType::ERROR => PromptLevel::Critical, lsp::MessageType::WARNING => PromptLevel::Warning, @@ -1226,7 +1226,7 @@ impl LocalLspStore { let name = name.to_string(); let mut cx = cx.clone(); - let (tx, _) = smol::channel::bounded(1); + let (tx, _) = async_channel::bounded(1); let level = match params.typ { lsp::MessageType::ERROR => PromptLevel::Critical, lsp::MessageType::WARNING => PromptLevel::Warning, @@ -13978,7 +13978,7 @@ pub struct LanguageServerPromptRequest { pub message: String, pub actions: Vec, pub lsp_name: String, - pub(crate) response_channel: smol::channel::Sender, + pub(crate) response_channel: async_channel::Sender, } impl LanguageServerPromptRequest { @@ -13987,7 +13987,7 @@ impl LanguageServerPromptRequest { message: String, actions: Vec, lsp_name: String, - response_channel: smol::channel::Sender, + response_channel: async_channel::Sender, ) -> Self { let id = NEXT_PROMPT_REQUEST_ID.fetch_add(1, atomic::Ordering::AcqRel); LanguageServerPromptRequest { @@ -14014,7 +14014,7 @@ impl LanguageServerPromptRequest { actions: Vec, lsp_name: String, ) -> Self { - let (tx, _rx) = smol::channel::unbounded(); + let (tx, _rx) = async_channel::unbounded(); LanguageServerPromptRequest::new(level, message, actions, lsp_name, tx) } } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index ea400e28e8..c0b39c33dd 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -5224,7 +5224,7 @@ impl Project { envelope: TypedEnvelope, mut cx: AsyncApp, ) -> Result { - let (tx, rx) = smol::channel::bounded(1); + let (tx, rx) = async_channel::bounded(1); let actions: Vec<_> = envelope .payload .actions diff --git a/crates/project/src/project_search.rs b/crates/project/src/project_search.rs index a191467016..2db893538c 100644 --- a/crates/project/src/project_search.rs +++ b/crates/project/src/project_search.rs @@ -10,6 +10,7 @@ use std::{ }; use anyhow::Context; +use async_channel::{Receiver, Sender, bounded, unbounded}; use collections::HashSet; use fs::Fs; use futures::FutureExt as _; @@ -19,7 +20,6 @@ use language::{Buffer, BufferSnapshot}; use parking_lot::Mutex; use postage::oneshot; use rpc::{AnyProtoClient, proto}; -use smol::channel::{Receiver, Sender, bounded, unbounded}; use util::{ResultExt, maybe, paths::compare_rel_paths, rel_path::RelPath}; use worktree::{Entry, ProjectEntryId, Snapshot, Worktree, WorktreeSettings}; diff --git a/crates/project/src/terminals.rs b/crates/project/src/terminals.rs index e22af5d552..aa0f94ef70 100644 --- a/crates/project/src/terminals.rs +++ b/crates/project/src/terminals.rs @@ -2,12 +2,12 @@ use anyhow::Result; use collections::HashMap; use gpui::{App, AppContext as _, Context, Entity, Task, WeakEntity}; +use async_channel::bounded; use futures::{FutureExt, future::Shared}; use itertools::Itertools as _; use language::LanguageName; use remote::RemoteClient; use settings::{Settings, SettingsLocation}; -use smol::channel::bounded; use std::{ path::{Path, PathBuf}, sync::Arc, diff --git a/crates/recent_projects/Cargo.toml b/crates/recent_projects/Cargo.toml index fbb7bb31a9..6062aaa8a9 100644 --- a/crates/recent_projects/Cargo.toml +++ b/crates/recent_projects/Cargo.toml @@ -44,7 +44,6 @@ semver.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true task.workspace = true telemetry.workspace = true ui.workspace = true diff --git a/crates/recent_projects/src/remote_servers.rs b/crates/recent_projects/src/remote_servers.rs index 77553791f8..f475baddd9 100644 --- a/crates/recent_projects/src/remote_servers.rs +++ b/crates/recent_projects/src/remote_servers.rs @@ -12,7 +12,7 @@ use dev_container::{ use editor::Editor; use extension_host::ExtensionStore; -use futures::{FutureExt, channel::oneshot, future::Shared}; +use futures::{FutureExt, StreamExt as _, channel::oneshot, future::Shared}; use gpui::{ Action, AnyElement, App, ClickEvent, ClipboardItem, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, PromptLevel, ScrollHandle, Subscription, Task, @@ -31,7 +31,6 @@ use settings::{ RemoteProject, RemoteSettingsContent, Settings as _, SettingsStore, update_settings_file, watch_config_file, }; -use smol::stream::StreamExt as _; use std::{ borrow::Cow, collections::BTreeSet, diff --git a/crates/remote_server/Cargo.toml b/crates/remote_server/Cargo.toml index c6ce45ba1c..48c047252f 100644 --- a/crates/remote_server/Cargo.toml +++ b/crates/remote_server/Cargo.toml @@ -23,6 +23,7 @@ test-support = ["fs/test-support"] [dependencies] anyhow.workspace = true +async-channel.workspace = true askpass.workspace = true clap.workspace = true client.workspace = true diff --git a/crates/remote_server/src/server.rs b/crates/remote_server/src/server.rs index bc39e4635e..c0a6d6de19 100644 --- a/crates/remote_server/src/server.rs +++ b/crates/remote_server/src/server.rs @@ -41,6 +41,7 @@ use rpc::proto::{self, Envelope, REMOTE_SERVER_PROJECT_ID}; use rpc::{AnyProtoClient, TypedEnvelope}; use settings::{Settings, SettingsStore, watch_config_file}; use smol::{ + Timer, channel::{Receiver, Sender}, io::AsyncReadExt, stream::StreamExt as _, @@ -181,7 +182,7 @@ fn init_logging_server(log_file_path: &Path) -> Result>> { .open(log_file_path) .context("Failed to open log file in append mode")?; - let (tx, rx) = smol::channel::unbounded(); + let (tx, rx) = async_channel::unbounded(); let target = Box::new(MultiWrite { file: log_file, @@ -472,6 +473,9 @@ pub fn execute_run( |task| { app.background_executor().spawn(task).detach(); }, + // we are running outside gpui + #[allow(clippy::disallowed_methods)] + |duration| FutureExt::map(Timer::after(duration), |_| ()), ); let log_rx = init_logging_server(&log_file)?; log::info!( @@ -727,6 +731,9 @@ pub(crate) fn execute_proxy( |task| { smol::spawn(task).detach(); }, + // we are running outside gpui + #[allow(clippy::disallowed_methods)] + |duration| FutureExt::map(Timer::after(duration), |_| ()), ); log::info!("starting proxy process. PID: {}", std::process::id()); @@ -755,7 +762,7 @@ pub(crate) fn execute_proxy( ); kill_running_server(pid, &server_paths)?; } - smol::block_on(spawn_server(&server_paths)).map_err(ExecuteProxyError::SpawnServer)?; + gpui::block_on(spawn_server(&server_paths)).map_err(ExecuteProxyError::SpawnServer)?; std::fs::read_to_string(&server_paths.pid_file) .and_then(|contents| { contents.parse::().map_err(|_| { @@ -826,7 +833,7 @@ pub(crate) fn execute_proxy( } }); - if let Err(forwarding_result) = smol::block_on(async move { + if let Err(forwarding_result) = gpui::block_on(async move { futures::select! { result = stdin_task.fuse() => result.map_err(ExecuteProxyError::StdinTask), result = stdout_task.fuse() => result.map_err(ExecuteProxyError::StdoutTask), @@ -834,7 +841,7 @@ pub(crate) fn execute_proxy( } }) { log::error!("encountered error while forwarding messages: {forwarding_result:#}",); - if !matches!(smol::block_on(check_server_running(server_pid)), Ok(true)) { + if !matches!(gpui::block_on(check_server_running(server_pid)), Ok(true)) { log::error!("server exited unexpectedly"); return Err(ExecuteProxyError::ServerNotRunning( ProxyLaunchError::ServerNotRunning, diff --git a/crates/search/Cargo.toml b/crates/search/Cargo.toml index 4213aa39a0..dac98f5245 100644 --- a/crates/search/Cargo.toml +++ b/crates/search/Cargo.toml @@ -27,6 +27,7 @@ bitflags.workspace = true collections.workspace = true editor.workspace = true fs.workspace = true +futures-lite.workspace = true futures.workspace = true gpui.workspace = true language.workspace = true @@ -36,7 +37,6 @@ project.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true theme.workspace = true theme_settings.workspace = true ui.workspace = true diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index 8170d303eb..41dda49efa 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -1942,10 +1942,10 @@ mod tests { SELECTION_HIGHLIGHT_DEBOUNCE_TIMEOUT, SearchSettings, SelectionEffects, display_map::DisplayRow, test::editor_test_context::EditorTestContext, }; + use futures::stream::StreamExt as _; use gpui::{Hsla, TestAppContext, UpdateGlobal, VisualTestContext}; use language::{Buffer, Point}; use settings::{SearchSettingsContent, SettingsStore}; - use smol::stream::StreamExt as _; use unindent::Unindent as _; use util_macros::perf; diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index c79937ab7a..6a092818a0 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -483,7 +483,7 @@ impl ProjectSearch { while let Some(new_ranges) = new_ranges.next().await { // `new_ranges.next().await` likely never gets hit while still pending so `async_task` // will not reschedule, starving other front end tasks, insert a yield point for that here - smol::future::yield_now().await; + futures_lite::future::yield_now().await; project_search .update(cx, |project_search, cx| { project_search.match_ranges.extend(new_ranges); diff --git a/crates/sidebar/Cargo.toml b/crates/sidebar/Cargo.toml index 97e0943980..be525a5c6e 100644 --- a/crates/sidebar/Cargo.toml +++ b/crates/sidebar/Cargo.toml @@ -17,6 +17,7 @@ default = [] [dependencies] acp_thread.workspace = true action_log.workspace = true +async-channel.workspace = true agent.workspace = true agent-client-protocol.workspace = true agent_settings.workspace = true @@ -38,7 +39,6 @@ remote_connection.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true -smol.workspace = true telemetry.workspace = true theme.workspace = true theme_settings.workspace = true diff --git a/crates/sidebar/src/sidebar.rs b/crates/sidebar/src/sidebar.rs index 80243a873b..ebf2518d68 100644 --- a/crates/sidebar/src/sidebar.rs +++ b/crates/sidebar/src/sidebar.rs @@ -3407,7 +3407,7 @@ impl Sidebar { thread_id: Option, neighbor: Option<&ThreadMetadata>, thread_folder_paths: Option<&PathList>, - in_flight_archive: Option<(Task<()>, smol::channel::Sender<()>)>, + in_flight_archive: Option<(Task<()>, async_channel::Sender<()>)>, window: &mut Window, cx: &mut Context, ) { @@ -3498,12 +3498,12 @@ impl Sidebar { thread_id: ThreadId, roots: Vec, cx: &mut Context, - ) -> Option<(Task<()>, smol::channel::Sender<()>)> { + ) -> Option<(Task<()>, async_channel::Sender<()>)> { if roots.is_empty() { return None; } - let (cancel_tx, cancel_rx) = smol::channel::bounded::<()>(1); + let (cancel_tx, cancel_rx) = async_channel::bounded::<()>(1); let task = cx.spawn(async move |_this, cx| { match Self::archive_worktree_roots(roots, cancel_rx, cx).await { Ok(ArchiveWorktreeOutcome::Success) => { @@ -3530,7 +3530,7 @@ impl Sidebar { async fn archive_worktree_roots( roots: Vec, - cancel_rx: smol::channel::Receiver<()>, + cancel_rx: async_channel::Receiver<()>, cx: &mut gpui::AsyncApp, ) -> anyhow::Result { let mut completed_persists: Vec<(i64, thread_worktree_archive::RootPlan)> = Vec::new(); diff --git a/crates/sqlez/Cargo.toml b/crates/sqlez/Cargo.toml index 5f4a0bef67..f5db6f96a0 100644 --- a/crates/sqlez/Cargo.toml +++ b/crates/sqlez/Cargo.toml @@ -16,7 +16,7 @@ indoc.workspace = true libsqlite3-sys.workspace = true log.workspace = true parking_lot.workspace = true -smol.workspace = true +pollster.workspace = true sqlformat.workspace = true thread_local = "1.1.4" util.workspace = true diff --git a/crates/sqlez/src/thread_safe_connection.rs b/crates/sqlez/src/thread_safe_connection.rs index 7b3630cdf6..1de70a0663 100644 --- a/crates/sqlez/src/thread_safe_connection.rs +++ b/crates/sqlez/src/thread_safe_connection.rs @@ -344,7 +344,7 @@ mod test { PRAGMA case_sensitive_like=TRUE; "}); - let _ = smol::block_on(builder.build()).unwrap().deref(); + let _ = pollster::block_on(builder.build()).unwrap().deref(); })); } diff --git a/crates/terminal/Cargo.toml b/crates/terminal/Cargo.toml index 1f6082e0bf..ad1a0753f5 100644 --- a/crates/terminal/Cargo.toml +++ b/crates/terminal/Cargo.toml @@ -20,10 +20,12 @@ path = "src/terminal.rs" doctest = false [dependencies] +async-channel.workspace = true alacritty_terminal.workspace = true anyhow.workspace = true collections.workspace = true futures.workspace = true +futures-lite.workspace = true gpui.workspace = true itertools.workspace = true libc.workspace = true @@ -34,7 +36,6 @@ schemars.workspace = true serde.workspace = true settings.workspace = true sysinfo.workspace = true -smol.workspace = true task.workspace = true theme.workspace = true theme_settings.workspace = true diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 74118d372d..e47cc2bb8d 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -26,6 +26,7 @@ use alacritty_terminal::{ }, }; use anyhow::{Context as _, Result, bail}; +use futures_lite::future::yield_now; use log::trace; use futures::{ @@ -39,12 +40,12 @@ use mappings::mouse::{ scroll_report, }; +use async_channel::{Receiver, Sender}; use collections::{HashMap, VecDeque}; use futures::StreamExt; use pty_info::{ProcessIdGetter, PtyProcessInfo}; use serde::{Deserialize, Serialize}; use settings::Settings; -use smol::channel::{Receiver, Sender}; use task::{HideStrategy, Shell, SpawnInTerminal}; use terminal_hyperlinks::RegexSearches; use terminal_settings::{AlternateScroll, CursorShape, TerminalSettings}; @@ -736,7 +737,7 @@ impl TerminalBuilder { } if events.is_empty() && !wakeup { - smol::future::yield_now().await; + yield_now().await; break 'outer; } @@ -749,7 +750,7 @@ impl TerminalBuilder { this.process_event(event, cx); } })?; - smol::future::yield_now().await; + yield_now().await; } } anyhow::Ok(()) @@ -2565,6 +2566,7 @@ mod tests { index::{Column, Line, Point as AlacPoint}, term::cell::Cell, }; + use async_channel::Receiver; use collections::HashMap; use gpui::{ Entity, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, @@ -2572,7 +2574,6 @@ mod tests { }; use parking_lot::Mutex; use rand::{Rng, distr, rngs::StdRng}; - use smol::channel::Receiver; use task::{Shell, ShellBuilder}; #[cfg(not(target_os = "windows"))] @@ -2591,7 +2592,7 @@ mod tests { command: &str, args: &[&str], ) -> (Entity, Receiver>) { - let (completion_tx, completion_rx) = smol::channel::unbounded(); + let (completion_tx, completion_rx) = async_channel::unbounded(); let args: Vec = args.iter().map(|s| s.to_string()).collect(); let (program, args) = ShellBuilder::new(&Shell::System, false).build(Some(command.to_owned()), &args); @@ -2744,7 +2745,7 @@ mod tests { cx.executor().allow_parking(); - let (completion_tx, completion_rx) = smol::channel::unbounded(); + let (completion_tx, completion_rx) = async_channel::unbounded(); let builder = cx .update(|cx| { TerminalBuilder::new( @@ -2770,7 +2771,7 @@ mod tests { // Build an empty command, which will result in a tty shell spawned. let terminal = cx.new(|cx| builder.subscribe(cx)); - let (event_tx, event_rx) = smol::channel::unbounded::(); + let (event_tx, event_rx) = async_channel::unbounded::(); cx.update(|cx| { cx.subscribe(&terminal, move |_, e, _| { event_tx.send_blocking(e.clone()).unwrap(); @@ -2841,7 +2842,7 @@ mod tests { .unwrap(); let terminal = cx.new(|cx| builder.subscribe(cx)); - let (event_tx, event_rx) = smol::channel::unbounded::(); + let (event_tx, event_rx) = async_channel::unbounded::(); cx.update(|cx| { cx.subscribe(&terminal, move |_, e, _| { event_tx.send_blocking(e.clone()).unwrap(); @@ -2876,7 +2877,7 @@ mod tests { async fn test_terminal_no_exit_on_spawn_failure(cx: &mut TestAppContext) { cx.executor().allow_parking(); - let (completion_tx, completion_rx) = smol::channel::unbounded(); + let (completion_tx, completion_rx) = async_channel::unbounded(); let (program, args) = ShellBuilder::new(&Shell::System, false) .build(Some("asdasdasdasd".to_owned()), &["@@@@@".to_owned()]); let builder = cx diff --git a/crates/workspace/Cargo.toml b/crates/workspace/Cargo.toml index 203980873d..0200f1b7d5 100644 --- a/crates/workspace/Cargo.toml +++ b/crates/workspace/Cargo.toml @@ -36,6 +36,7 @@ clock.workspace = true collections.workspace = true component.workspace = true db.workspace = true +futures-lite.workspace = true fs.workspace = true futures.workspace = true git.workspace = true diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index a6d966bb23..8b54a995a8 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -17,7 +17,6 @@ mod persistence; pub mod searchable; mod security_modal; pub mod shared_screen; -use db::smol::future::yield_now; pub use shared_screen::SharedScreen; pub mod focus_follows_mouse; mod status_bar; @@ -3389,7 +3388,7 @@ impl Workspace { .unwrap_or(false); if focus_changed { - yield_now().await; + futures_lite::future::yield_now().await; } } diff --git a/crates/worktree/Cargo.toml b/crates/worktree/Cargo.toml index 6d8faad3dc..5aac6f2417 100644 --- a/crates/worktree/Cargo.toml +++ b/crates/worktree/Cargo.toml @@ -31,6 +31,7 @@ test-support = [ [dependencies] anyhow.workspace = true +async-channel.workspace = true async-lock.workspace = true chardetng.workspace = true clock.workspace = true @@ -53,7 +54,6 @@ serde.workspace = true serde_json.workspace = true settings.workspace = true smallvec.workspace = true -smol.workspace = true sum_tree.workspace = true text.workspace = true tracing.workspace = true diff --git a/crates/worktree/src/worktree.rs b/crates/worktree/src/worktree.rs index 4a85e91c5a..3f58448d31 100644 --- a/crates/worktree/src/worktree.rs +++ b/crates/worktree/src/worktree.rs @@ -31,6 +31,7 @@ use gpui::{ use ignore::IgnoreStack; use language::{ByteContent, DiskState, FILE_ANALYSIS_BYTES, analyze_byte_content}; +use async_channel::{self, Sender}; use parking_lot::Mutex; use paths::{local_settings_folder_name, local_vscode_folder_name}; use postage::{ @@ -45,7 +46,6 @@ use rpc::{ pub use settings::WorktreeId; use settings::{Settings, SettingsLocation, SettingsStore}; use smallvec::{SmallVec, smallvec}; -use smol::channel::{self, Sender}; use std::{ any::Any, borrow::Borrow as _, @@ -127,8 +127,8 @@ impl fmt::Debug for LoadedBinaryFile { pub struct LocalWorktree { snapshot: LocalSnapshot, - scan_requests_tx: channel::Sender, - path_prefixes_to_scan_tx: channel::Sender, + scan_requests_tx: async_channel::Sender, + path_prefixes_to_scan_tx: async_channel::Sender, is_scanning: (watch::Sender, watch::Receiver), snapshot_subscriptions: VecDeque<(usize, oneshot::Sender<()>)>, _background_scanner_tasks: Vec>, @@ -483,8 +483,8 @@ impl Worktree { .block_on(snapshot.insert_entry(entry, fs.as_ref())); } - let (scan_requests_tx, scan_requests_rx) = channel::unbounded(); - let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = channel::unbounded(); + let (scan_requests_tx, scan_requests_rx) = async_channel::unbounded(); + let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = async_channel::unbounded(); let mut worktree = LocalWorktree { share_private_files, next_entry_id, @@ -1119,8 +1119,8 @@ impl LocalWorktree { } fn restart_background_scanners(&mut self, cx: &Context) { - let (scan_requests_tx, scan_requests_rx) = channel::unbounded(); - let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = channel::unbounded(); + let (scan_requests_tx, scan_requests_rx) = async_channel::unbounded(); + let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = async_channel::unbounded(); self.scan_requests_tx = scan_requests_tx; self.path_prefixes_to_scan_tx = path_prefixes_to_scan_tx; @@ -1138,8 +1138,8 @@ impl LocalWorktree { fn start_background_scanner( &mut self, - scan_requests_rx: channel::Receiver, - path_prefixes_to_scan_rx: channel::Receiver, + scan_requests_rx: async_channel::Receiver, + path_prefixes_to_scan_rx: async_channel::Receiver, cx: &Context, ) { let snapshot = self.snapshot(); @@ -3929,8 +3929,8 @@ struct BackgroundScanner { fs_case_sensitive: bool, status_updates_tx: UnboundedSender, executor: BackgroundExecutor, - scan_requests_rx: channel::Receiver, - path_prefixes_to_scan_rx: channel::Receiver, + scan_requests_rx: async_channel::Receiver, + path_prefixes_to_scan_rx: async_channel::Receiver, next_entry_id: Arc, phase: BackgroundScannerPhase, watcher: Arc, @@ -4035,7 +4035,7 @@ impl BackgroundScanner { Box::pin(futures::stream::pending()) }; - let (scan_job_tx, scan_job_rx) = channel::unbounded(); + let (scan_job_tx, scan_job_rx) = async_channel::unbounded(); { let mut state = self.state.lock().await; state.snapshot.scan_id += 1; @@ -4494,7 +4494,7 @@ impl BackgroundScanner { self.state.lock().await.snapshot.scan_id += 1; - let (scan_job_tx, scan_job_rx) = channel::unbounded(); + let (scan_job_tx, scan_job_rx) = async_channel::unbounded(); log::debug!( "received fs events {:?}", relative_paths @@ -4559,7 +4559,7 @@ impl BackgroundScanner { .await; (state.snapshot.clone(), ignore_stack, abs_path) }; - let (scan_job_tx, scan_job_rx) = channel::unbounded(); + let (scan_job_tx, scan_job_rx) = async_channel::unbounded(); self.update_ignore_statuses_for_paths( scan_job_tx, prev_snapshot, @@ -4571,7 +4571,7 @@ impl BackgroundScanner { } async fn forcibly_load_paths(&self, paths: &[Arc]) -> bool { - let (scan_job_tx, scan_job_rx) = channel::unbounded(); + let (scan_job_tx, scan_job_rx) = async_channel::unbounded(); { let mut state = self.state.lock().await; let root_path = state.snapshot.abs_path.clone(); @@ -4614,7 +4614,7 @@ impl BackgroundScanner { async fn scan_dirs( &self, enable_progress_updates: bool, - scan_jobs_rx: channel::Receiver, + scan_jobs_rx: async_channel::Receiver, ) { if self .status_updates_tx @@ -5138,7 +5138,7 @@ impl BackgroundScanner { prev_snapshot: LocalSnapshot, ignores_to_update: Vec<(Arc, IgnoreStack)>, ) { - let (ignore_queue_tx, ignore_queue_rx) = channel::unbounded(); + let (ignore_queue_tx, ignore_queue_rx) = async_channel::unbounded(); { for (parent_abs_path, ignore_stack) in ignores_to_update { ignore_queue_tx diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 627d514f6c..234179f9a5 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -337,7 +337,7 @@ fn main() { session_id.clone(), KeyValueStore::from_app_db(&app_db), )); - + let background_executor = app.background_executor(); crashes::init( InitCrashHandler { session_id, @@ -358,6 +358,7 @@ fn main() { |task| { app.background_executor().spawn(task).detach(); }, + move |duration| background_executor.timer(duration), ); let (open_listener, mut open_rx) = OpenListener::new(); diff --git a/crates/zed/src/zed/visual_tests.rs b/crates/zed/src/zed/visual_tests.rs index 982db08782..610621f480 100644 --- a/crates/zed/src/zed/visual_tests.rs +++ b/crates/zed/src/zed/visual_tests.rs @@ -441,7 +441,7 @@ mod tests { let mut cx = VisualTestAppContext::new(gpui_platform::current_platform(false)); let app_state = init_visual_test(&mut cx); - smol::block_on(async { + gpui::block_on(async { app_state .fs .as_fake() @@ -456,7 +456,7 @@ mod tests { .await; }); - let workspace_result = smol::block_on(open_test_workspace(app_state, &mut cx)); + let workspace_result = gpui::block_on(open_test_workspace(app_state, &mut cx)); assert!( workspace_result.is_ok(), "Failed to open workspace: {:?}", @@ -482,7 +482,7 @@ mod tests { let mut cx = VisualTestAppContext::new(gpui_platform::current_platform(false)); let app_state = init_visual_test(&mut cx); - smol::block_on(async { + gpui::block_on(async { app_state .fs .as_fake() @@ -498,10 +498,10 @@ mod tests { .await; }); - let workspace = smol::block_on(open_test_workspace(app_state, &mut cx)) + let workspace = gpui::block_on(open_test_workspace(app_state, &mut cx)) .expect("Failed to open workspace"); - smol::block_on(async { + gpui::block_on(async { wait_for_ui_stabilization(&cx).await; let screenshot_result = cx.capture_screenshot(workspace.into());