@@ -86,9 +86,9 @@ fn process_server_reader(reader: impl std::io::Read,
8686
8787pub fn run_app_forever ( client_reader : impl std:: io:: Read + Send + ' static ,
8888 client_writer : impl std:: io:: Write + Send + ' static ,
89- mut server_cmd : std:: process:: Command ) -> Result < ( ) > {
89+ mut server_cmd : std:: process:: Command ) -> Result < std :: process :: ExitStatus > {
9090 info ! ( "Running server {:?}" , server_cmd) ;
91- let proc = server_cmd
91+ let mut proc = server_cmd
9292 . stdin ( std:: process:: Stdio :: piped ( ) )
9393 . stdout ( std:: process:: Stdio :: piped ( ) )
9494 . stderr ( std:: process:: Stdio :: inherit ( ) )
@@ -98,37 +98,35 @@ pub fn run_app_forever(client_reader: impl std::io::Read + Send + 'static,
9898 let c2s_channel_counter = Arc :: new ( AtomicI32 :: new ( 0 ) ) ;
9999 let ( s2c_channel_pub, s2c_channel_sub) = mpsc:: channel :: < String > ( ) ;
100100
101- let threads = vec ! [
102- {
103- let c2s_channel_counter = c2s_channel_counter. clone( ) ;
104- std:: thread:: spawn( move || {
105- info!( "Started client->server write thread" ) ;
106- process_channel_to_writer( c2s_channel_sub, Some ( c2s_channel_counter) , proc. stdin. unwrap( ) ) . unwrap( ) ;
107- info!( "Finished client->server write thread" ) ;
108- } )
109- } ,
101+ {
102+ let c2s_channel_counter = c2s_channel_counter. clone ( ) ;
103+ let proc_stdin = proc. stdin . take ( ) . unwrap ( ) ;
110104 std:: thread:: spawn ( move || {
111- info!( "Started server->client write thread" ) ;
112- process_channel_to_writer( s2c_channel_sub, None , client_writer) . unwrap( ) ;
113- info!( "Finished server->client write thread" ) ;
114- } ) ,
115- {
116- let s2c_channel_pub = s2c_channel_pub. clone( ) ;
117- std:: thread:: spawn( move || {
118- info!( "Started server->client read thread" ) ;
119- process_server_reader( proc. stdout. unwrap( ) , s2c_channel_pub) . unwrap( ) ;
120- info!( "Finished server->client read thread" ) ;
121- } )
122- } ,
105+ info ! ( "Started client->server write thread" ) ;
106+ process_channel_to_writer ( c2s_channel_sub, Some ( c2s_channel_counter) , proc_stdin) . unwrap ( ) ;
107+ info ! ( "Finished client->server write thread" ) ;
108+ } ) ;
109+ }
110+ std:: thread:: spawn ( move || {
111+ info ! ( "Started server->client write thread" ) ;
112+ process_channel_to_writer ( s2c_channel_sub, None , client_writer) . unwrap ( ) ;
113+ info ! ( "Finished server->client write thread" ) ;
114+ } ) ;
115+ {
116+ let s2c_channel_pub = s2c_channel_pub. clone ( ) ;
117+ let proc_stdout = proc. stdout . take ( ) . unwrap ( ) ;
123118 std:: thread:: spawn ( move || {
124- info!( "Started client->server read thread" ) ;
125- process_client_reader(
126- client_reader, c2s_channel_pub, c2s_channel_counter, s2c_channel_pub) . unwrap( ) ;
127- info!( "Finished client->server read thread" ) ;
128- } ) ,
129- ] ;
130-
131- threads. into_iter ( ) . for_each ( |x| x. join ( ) . unwrap ( ) ) ;
119+ info ! ( "Started server->client read thread" ) ;
120+ process_server_reader ( proc_stdout, s2c_channel_pub) . unwrap ( ) ;
121+ info ! ( "Finished server->client read thread" ) ;
122+ } ) ;
123+ }
124+ std:: thread:: spawn ( move || {
125+ info ! ( "Started client->server read thread" ) ;
126+ process_client_reader (
127+ client_reader, c2s_channel_pub, c2s_channel_counter, s2c_channel_pub) . unwrap ( ) ;
128+ info ! ( "Finished client->server read thread" ) ;
129+ } ) ;
132130
133- Ok ( ( ) )
131+ Ok ( proc . wait ( ) ? )
134132}
0 commit comments