From 7629c161622ebda383b98f540cc7991ca9a6bd51 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Thu, 14 Mar 2024 16:17:12 +0100 Subject: [PATCH] Always read files to string on a background thread (#9341) We noticed that when you open a lot of files (i.e. project-wide search with multi-buffer) that the main thread can become unresponsive, because while we are async, we still load these files on the main thread. What this change does is it uses `smol::unblock` to load files on a different thread. Release Notes: - Improved responsiveness when loading files into memory. Co-authored-by: Antonio Co-authored-by: Kirill --- crates/fs/src/fs.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index 522cecb586..0282dd3b46 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -214,12 +214,9 @@ impl Fs for RealFs { } async fn load(&self, path: &Path) -> Result { - let mut file = smol::fs::File::open(path).await?; - // We use `read_exact` here instead of `read_to_string` as the latter is *very* - // happy to reallocate often, which comes into play when we're loading large files. - let mut storage = vec![0; file.metadata().await?.len() as usize]; - file.read_exact(&mut storage).await?; - Ok(String::from_utf8(storage)?) + let path = path.to_path_buf(); + let text = smol::unblock(|| std::fs::read_to_string(path)).await?; + Ok(text) } async fn atomic_write(&self, path: PathBuf, data: String) -> Result<()> {