@@ -11,15 +11,24 @@ use crate::Message;
11
11
12
12
/// Creates an LSP connection via stdio.
13
13
pub ( crate ) fn stdio_transport ( ) -> ( Sender < Message > , Receiver < Message > , IoThreads ) {
14
+ let ( drop_sender, drop_receiver) = bounded :: < Message > ( 0 ) ;
14
15
let ( writer_sender, writer_receiver) = bounded :: < Message > ( 0 ) ;
15
16
let writer = thread:: Builder :: new ( )
16
17
. name ( "LspServerWriter" . to_owned ( ) )
17
18
. spawn ( move || {
18
19
let stdout = stdout ( ) ;
19
20
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
+ } )
21
26
} )
22
27
. unwrap ( ) ;
28
+ let dropper = thread:: Builder :: new ( )
29
+ . name ( "LspMessageDropper" . to_owned ( ) )
30
+ . spawn ( move || drop_receiver. into_iter ( ) . for_each ( drop) )
31
+ . unwrap ( ) ;
23
32
let ( reader_sender, reader_receiver) = bounded :: < Message > ( 0 ) ;
24
33
let reader = thread:: Builder :: new ( )
25
34
. name ( "LspServerReader" . to_owned ( ) )
@@ -41,21 +50,23 @@ pub(crate) fn stdio_transport() -> (Sender<Message>, Receiver<Message>, IoThread
41
50
Ok ( ( ) )
42
51
} )
43
52
. unwrap ( ) ;
44
- let threads = IoThreads { reader, writer } ;
53
+ let threads = IoThreads { reader, writer, dropper } ;
45
54
( writer_sender, reader_receiver, threads)
46
55
}
47
56
48
57
// Creates an IoThreads
49
58
pub ( crate ) fn make_io_threads (
50
59
reader : thread:: JoinHandle < io:: Result < ( ) > > ,
51
60
writer : thread:: JoinHandle < io:: Result < ( ) > > ,
61
+ dropper : thread:: JoinHandle < ( ) > ,
52
62
) -> IoThreads {
53
- IoThreads { reader, writer }
63
+ IoThreads { reader, writer, dropper }
54
64
}
55
65
56
66
pub struct IoThreads {
57
67
reader : thread:: JoinHandle < io:: Result < ( ) > > ,
58
68
writer : thread:: JoinHandle < io:: Result < ( ) > > ,
69
+ dropper : thread:: JoinHandle < ( ) > ,
59
70
}
60
71
61
72
impl IoThreads {
@@ -64,6 +75,12 @@ impl IoThreads {
64
75
Ok ( r) => r?,
65
76
Err ( err) => std:: panic:: panic_any ( err) ,
66
77
}
78
+ match self . dropper . join ( ) {
79
+ Ok ( _) => ( ) ,
80
+ Err ( err) => {
81
+ std:: panic:: panic_any ( err) ;
82
+ }
83
+ }
67
84
match self . writer . join ( ) {
68
85
Ok ( r) => r,
69
86
Err ( err) => {
0 commit comments