From bf352cd2511775a331d77dee261b64bd8359dacb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 14 Feb 2019 20:43:45 +0300 Subject: automatically wait for worker threads closes #817 --- crates/ra_lsp_server/src/main_loop.rs | 26 ++++++++++++-------------- crates/ra_lsp_server/src/project_model.rs | 6 +++--- 2 files changed, 15 insertions(+), 17 deletions(-) (limited to 'crates/ra_lsp_server/src') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index a51299851..06443bb76 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -54,19 +54,20 @@ pub fn main_loop( ) -> Result<()> { let pool = ThreadPool::new(THREADPOOL_SIZE); let (task_sender, task_receiver) = unbounded::(); - let (ws_worker, ws_watcher) = workspace_loader(); - ws_worker.send(ws_root.clone()).unwrap(); // FIXME: support dynamic workspace loading. - let workspaces = match ws_worker.recv().unwrap() { - Ok(ws) => vec![ws], - Err(e) => { - log::error!("loading workspace failed: {}", e); - Vec::new() + let workspaces = { + let ws_worker = workspace_loader(); + ws_worker.sender().send(ws_root.clone()).unwrap(); + match ws_worker.receiver().recv().unwrap() { + Ok(ws) => vec![ws], + Err(e) => { + log::error!("loading workspace failed: {}", e); + Vec::new() + } } }; - ws_worker.shutdown(); - ws_watcher.shutdown().map_err(|_| format_err!("ws watcher died"))?; + let mut state = ServerWorldState::new(ws_root.clone(), workspaces); log::info!("server initialized, serving requests"); @@ -94,12 +95,9 @@ pub fn main_loop( log::info!("...threadpool has finished"); let vfs = Arc::try_unwrap(state.vfs).expect("all snapshots should be dead"); - let vfs_res = vfs.into_inner().shutdown(); + drop(vfs); - main_res?; - vfs_res.map_err(|_| format_err!("fs watcher died"))?; - - Ok(()) + main_res } enum Event { diff --git a/crates/ra_lsp_server/src/project_model.rs b/crates/ra_lsp_server/src/project_model.rs index 6800eb138..7d6440fad 100644 --- a/crates/ra_lsp_server/src/project_model.rs +++ b/crates/ra_lsp_server/src/project_model.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use thread_worker::{WorkerHandle, Worker}; +use thread_worker::Worker; use crate::Result; @@ -8,8 +8,8 @@ pub use ra_project_model::{ ProjectWorkspace, CargoWorkspace, Package, Target, TargetKind, Sysroot, }; -pub fn workspace_loader() -> (Worker>, WorkerHandle) { - thread_worker::spawn::, _>( +pub fn workspace_loader() -> Worker> { + Worker::>::spawn( "workspace loader", 1, |input_receiver, output_sender| { -- cgit v1.2.3