Breaks read loop on 'exit'
This commit is contained in:
parent
13d92b3f11
commit
8d569d49d2
3 changed files with 17 additions and 5 deletions
|
@ -22,7 +22,7 @@
|
||||||
//! sender,
|
//! sender,
|
||||||
//! main_loop,
|
//! main_loop,
|
||||||
//! )?;
|
//! )?;
|
||||||
//! io_threads.exit()?;
|
//! io_threads.join()?;
|
||||||
//! Ok(())
|
//! Ok(())
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue