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

View File

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

View File

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

View File

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