From 13100da7a2aa97cdbda9ed4bd99896e2ff6d5cf6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 9 Dec 2018 13:13:36 +0300 Subject: switch threadpool back from rayon to threadpool rayon does not replenish the pool when the thread panics, but we must be reselient to bugs. --- crates/ra_lsp_server/Cargo.toml | 1 + crates/ra_lsp_server/src/main_loop.rs | 15 ++++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) (limited to 'crates') diff --git a/crates/ra_lsp_server/Cargo.toml b/crates/ra_lsp_server/Cargo.toml index 79d86f9b2..5ee218b6b 100644 --- a/crates/ra_lsp_server/Cargo.toml +++ b/crates/ra_lsp_server/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Aleksey Kladov "] [dependencies] rayon = "1.0.2" +threadpool = "1.7.1" relative-path = "0.4.0" failure = "0.1.2" failure_derive = "0.1.2" diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 0e1878906..a01eeff88 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -9,7 +9,8 @@ use gen_lsp_server::{ }; use languageserver_types::NumberOrString; use ra_analysis::{Canceled, FileId, LibraryData}; -use rayon::{self, ThreadPool}; +use rayon; +use threadpool::ThreadPool; use rustc_hash::FxHashSet; use serde::{de::DeserializeOwned, Serialize}; use failure::{format_err, bail}; @@ -54,11 +55,7 @@ pub fn main_loop( msg_receiver: &Receiver, msg_sender: &Sender, ) -> Result<()> { - let pool = rayon::ThreadPoolBuilder::new() - .num_threads(4) - .panic_handler(|_| log::error!("thread panicked :(")) - .build() - .unwrap(); + let pool = ThreadPool::new(8); let (task_sender, task_receiver) = unbounded::(); let (fs_worker, fs_watcher) = vfs::roots_loader(); let (ws_worker, ws_watcher) = workspace_loader(); @@ -155,7 +152,7 @@ fn main_loop_inner( } else { let (files, resolver) = state.events_to_files(events); let sender = libdata_sender.clone(); - pool.spawn(move || { + pool.execute(move || { let start = ::std::time::Instant::now(); log::info!("indexing {} ... ", root.display()); let data = LibraryData::prepare(files, resolver); @@ -402,7 +399,7 @@ impl<'a> PoolDispatcher<'a> { Ok((id, params)) => { let world = self.world.snapshot(); let sender = self.sender.clone(); - self.pool.spawn(move || { + self.pool.execute(move || { let resp = match f(world, params) { Ok(resp) => RawResponse::ok::(id, &resp), Err(e) => match e.downcast::() { @@ -452,7 +449,7 @@ fn update_file_notifications_on_threadpool( sender: Sender, subscriptions: Vec, ) { - pool.spawn(move || { + pool.execute(move || { for file_id in subscriptions { match handlers::publish_diagnostics(&world, file_id) { Err(e) => { -- cgit v1.2.3 From 159525b120121b217f2831869b6ea9a3cf9fe554 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 9 Dec 2018 13:18:46 +0300 Subject: Check Fileid in SourceFileMap --- crates/ra_hir/src/lib.rs | 20 ++++++++++++++++++-- crates/ra_hir/src/module.rs | 2 +- crates/ra_hir/src/module/nameres.rs | 4 ++-- crates/ra_hir/src/query_definitions.rs | 2 +- crates/ra_hir/src/source_binder.rs | 2 +- 5 files changed, 23 insertions(+), 7 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 983ce99cb..f50b922af 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -110,16 +110,32 @@ pub struct SourceItemId { } /// Maps item's `SyntaxNode`s to `SourceFileItemId` and back. -#[derive(Debug, PartialEq, Eq, Default)] +#[derive(Debug, PartialEq, Eq)] pub struct SourceFileItems { + file_id: FileId, arena: Arena, } impl SourceFileItems { + fn new(file_id: FileId) -> SourceFileItems { + SourceFileItems { + file_id, + arena: Arena::default(), + } + } + fn alloc(&mut self, item: SyntaxNode) -> SourceFileItemId { self.arena.alloc(item) } - pub fn id_of(&self, item: SyntaxNodeRef) -> SourceFileItemId { + pub fn id_of(&self, file_id: FileId, item: SyntaxNodeRef) -> SourceFileItemId { + assert_eq!( + self.file_id, file_id, + "SourceFileItems: wrong file, expected {:?}, got {:?}", + self.file_id, file_id + ); + self.id_of_unchecked(item) + } + fn id_of_unchecked(&self, item: SyntaxNodeRef) -> SourceFileItemId { let (id, _item) = self .arena .iter() diff --git a/crates/ra_hir/src/module.rs b/crates/ra_hir/src/module.rs index 580c737c3..e7a49f83a 100644 --- a/crates/ra_hir/src/module.rs +++ b/crates/ra_hir/src/module.rs @@ -280,7 +280,7 @@ impl ModuleSource { ) -> ModuleSource { assert!(!m.has_semi()); let file_items = db.file_items(file_id); - let item_id = file_items.id_of(m.syntax()); + let item_id = file_items.id_of(file_id, m.syntax()); ModuleSource::new(file_id, item_id) } diff --git a/crates/ra_hir/src/module/nameres.rs b/crates/ra_hir/src/module/nameres.rs index 61a1acfe6..6511359d0 100644 --- a/crates/ra_hir/src/module/nameres.rs +++ b/crates/ra_hir/src/module/nameres.rs @@ -168,7 +168,7 @@ impl InputModuleItems { } fn add_use_item(&mut self, file_items: &SourceFileItems, item: ast::UseItem) { - let file_item_id = file_items.id_of(item.syntax()); + let file_item_id = file_items.id_of_unchecked(item.syntax()); let start_offset = item.syntax().range().start(); Path::expand_use_item(item, |path, range| { let kind = match range { @@ -188,7 +188,7 @@ impl ModuleItem { let name = item.name()?.text(); let kind = item.syntax().kind(); let vis = Vis::Other; - let id = file_items.id_of(item.syntax()); + let id = file_items.id_of_unchecked(item.syntax()); let res = ModuleItem { id, name, diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs index e4d721601..bb4457d07 100644 --- a/crates/ra_hir/src/query_definitions.rs +++ b/crates/ra_hir/src/query_definitions.rs @@ -36,7 +36,7 @@ pub(super) fn fn_scopes(db: &impl HirDatabase, fn_id: FnId) -> Arc { } pub(super) fn file_items(db: &impl HirDatabase, file_id: FileId) -> Arc { - let mut res = SourceFileItems::default(); + let mut res = SourceFileItems::new(file_id); let source_file = db.source_file(file_id); res.alloc(source_file.syntax().owned()); let source_file = source_file.borrowed(); diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 479155805..0c16ccc24 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -75,7 +75,7 @@ pub fn function_from_source( ) -> Cancelable> { let module = ctry!(module_from_child_node(db, file_id, fn_def.syntax())?); let file_items = db.file_items(file_id); - let item_id = file_items.id_of(fn_def.syntax()); + let item_id = file_items.id_of(file_id, fn_def.syntax()); let source_item_id = SourceItemId { file_id, item_id }; let def_loc = DefLoc { kind: DefKind::Function, -- cgit v1.2.3