index libraies off the main thread

This commit is contained in:
Aleksey Kladov 2018-09-03 21:26:59 +03:00
parent 47cbaeba6f
commit 5ba645c009
5 changed files with 39 additions and 13 deletions

View file

@ -10,7 +10,7 @@ use threadpool::ThreadPool;
use serde::{Serialize, de::DeserializeOwned};
use crossbeam_channel::{bounded, Sender, Receiver};
use languageserver_types::{NumberOrString};
use libanalysis::{FileId, JobHandle, JobToken};
use libanalysis::{FileId, JobHandle, JobToken, LibraryData};
use gen_lsp_server::{
RawRequest, RawNotification, RawMessage, RawResponse, ErrorCode,
handle_shutdown,
@ -94,6 +94,7 @@ fn main_loop_inner(
pending_requests: &mut HashMap<u64, JobHandle>,
subs: &mut Subscriptions,
) -> Result<()> {
let (libdata_sender, libdata_receiver) = bounded(1024);
ws_sender.send(ws_root.clone());
fs_sender.send(ws_root.clone());
loop {
@ -103,6 +104,7 @@ fn main_loop_inner(
Task(Task),
Fs(PathBuf, Vec<FileEvent>),
Ws(Result<CargoWorkspace>),
Lib(LibraryData),
}
trace!("selecting");
let event = select! {
@ -119,6 +121,7 @@ fn main_loop_inner(
None => bail!("workspace watcher died"),
Some(ws) => Event::Ws(ws),
}
recv(libdata_receiver, data) => Event::Lib(data.unwrap())
};
trace!("selected {:?}", event);
let mut state_changed = false;
@ -129,7 +132,12 @@ fn main_loop_inner(
if root == ws_root {
state.apply_fs_changes(events);
} else {
state.add_library(events);
let files = state.events_to_files(events);
let sender = libdata_sender.clone();
pool.execute(move || {
let data = LibraryData::prepare(files);
sender.send(data);
});
}
state_changed = true;
}
@ -152,6 +160,9 @@ fn main_loop_inner(
Err(e) => warn!("loading workspace failed: {}", e),
}
}
Event::Lib(lib) => {
state.add_lib(lib);
}
Event::Msg(msg) => {
match msg {
RawMessage::Request(req) => {