@@ -11,15 +11,24 @@ use crate::Message;
1111
1212/// Creates an LSP connection via stdio.
1313pub ( crate ) fn stdio_transport ( ) -> ( Sender < Message > , Receiver < Message > , IoThreads ) {
14+ let ( drop_sender, drop_receiver) = bounded :: < Message > ( 0 ) ;
1415 let ( writer_sender, writer_receiver) = bounded :: < Message > ( 0 ) ;
1516 let writer = thread:: Builder :: new ( )
1617 . name ( "LspServerWriter" . to_owned ( ) )
1718 . spawn ( move || {
1819 let stdout = stdout ( ) ;
1920 let mut stdout = stdout. lock ( ) ;
20- writer_receiver. into_iter ( ) . try_for_each ( |it| it. write ( & mut stdout) )
21+ writer_receiver. into_iter ( ) . try_for_each ( |it| {
22+ let result = it. write ( & mut stdout) ;
23+ let _ = drop_sender. send ( it) ;
24+ result
25+ } )
2126 } )
2227 . unwrap ( ) ;
28+ let dropper = thread:: Builder :: new ( )
29+ . name ( "LspMessageDropper" . to_owned ( ) )
30+ . spawn ( move || drop_receiver. into_iter ( ) . for_each ( drop) )
31+ . unwrap ( ) ;
2332 let ( reader_sender, reader_receiver) = bounded :: < Message > ( 0 ) ;
2433 let reader = thread:: Builder :: new ( )
2534 . name ( "LspServerReader" . to_owned ( ) )
@@ -41,21 +50,23 @@ pub(crate) fn stdio_transport() -> (Sender<Message>, Receiver<Message>, IoThread
4150 Ok ( ( ) )
4251 } )
4352 . unwrap ( ) ;
44- let threads = IoThreads { reader, writer } ;
53+ let threads = IoThreads { reader, writer, dropper } ;
4554 ( writer_sender, reader_receiver, threads)
4655}
4756
4857// Creates an IoThreads
4958pub ( crate ) fn make_io_threads (
5059 reader : thread:: JoinHandle < io:: Result < ( ) > > ,
5160 writer : thread:: JoinHandle < io:: Result < ( ) > > ,
61+ dropper : thread:: JoinHandle < ( ) > ,
5262) -> IoThreads {
53- IoThreads { reader, writer }
63+ IoThreads { reader, writer, dropper }
5464}
5565
5666pub struct IoThreads {
5767 reader : thread:: JoinHandle < io:: Result < ( ) > > ,
5868 writer : thread:: JoinHandle < io:: Result < ( ) > > ,
69+ dropper : thread:: JoinHandle < ( ) > ,
5970}
6071
6172impl IoThreads {
@@ -64,6 +75,12 @@ impl IoThreads {
6475 Ok ( r) => r?,
6576 Err ( err) => std:: panic:: panic_any ( err) ,
6677 }
78+ match self . dropper . join ( ) {
79+ Ok ( _) => ( ) ,
80+ Err ( err) => {
81+ std:: panic:: panic_any ( err) ;
82+ }
83+ }
6784 match self . writer . join ( ) {
6885 Ok ( r) => r,
6986 Err ( err) => {
0 commit comments