Breaks read loop on 'exit'

This commit is contained in:
Roberto Vidal 2019-04-17 00:32:33 +02:00
parent 13d92b3f11
commit 8d569d49d2
3 changed files with 17 additions and 5 deletions
crates
gen_lsp_server/src
ra_lsp_server/src

View file

@ -22,7 +22,7 @@
//! sender, //! sender,
//! main_loop, //! main_loop,
//! )?; //! )?;
//! io_threads.exit()?; //! io_threads.join()?;
//! Ok(()) //! Ok(())
//! } //! }
//! //!

View file

@ -5,6 +5,7 @@ use std::{
use crossbeam_channel::{bounded, Receiver, Sender}; use crossbeam_channel::{bounded, Receiver, Sender};
use failure::bail; use failure::bail;
use lsp_types::notification::Exit;
use crate::{RawMessage, Result}; use crate::{RawMessage, Result};
@ -21,9 +22,18 @@ pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads)
let stdin = stdin(); let stdin = stdin();
let mut stdin = stdin.lock(); let mut stdin = stdin.lock();
while let Some(msg) = RawMessage::read(&mut stdin)? { while let Some(msg) = RawMessage::read(&mut stdin)? {
let is_exit = match &msg {
RawMessage::Notification(n) => n.is::<Exit>(),
_ => false,
};
if let Err(_) = reader_sender.send(msg) { if let Err(_) = reader_sender.send(msg) {
break; break;
} }
if is_exit {
break;
}
} }
Ok(()) Ok(())
}); });
@ -37,9 +47,11 @@ pub struct Threads {
} }
impl Threads { impl Threads {
pub fn exit(self) -> Result<()> { pub fn join(self) -> Result<()> {
// We can't rely on stdin being closed match self.reader.join() {
drop(self.reader); Ok(r) => r?,
Err(_) => bail!("reader panicked"),
}
match self.writer.join() { match self.writer.join() {
Ok(r) => r, Ok(r) => r,
Err(_) => bail!("writer panicked"), Err(_) => bail!("writer panicked"),

View file

@ -54,7 +54,7 @@ fn main_inner() -> Result<()> {
ra_lsp_server::main_loop(workspace_roots, opts, r, s) ra_lsp_server::main_loop(workspace_roots, opts, r, s)
})?; })?;
log::info!("shutting down IO..."); log::info!("shutting down IO...");
threads.exit()?; threads.join()?;
log::info!("... IO is down"); log::info!("... IO is down");
Ok(()) Ok(())
} }