@@ -10,6 +10,8 @@ use portable_pty::{ChildKiller, ExitStatus, MasterPty};
1010
1111use crate :: geo:: ScreenSize ;
1212
13+ type ChildWaitResult = Result < ExitStatus , Arc < std:: io:: Error > > ;
14+
1315/// The read half of a PTY connection. Implements [`Read`].
1416///
1517/// Reading feeds data through an internal vt100 parser (shared with [`PtyWriter`]),
@@ -32,7 +34,7 @@ pub struct PtyWriter {
3234/// A cloneable handle to a child process spawned in a PTY.
3335pub struct ChildHandle {
3436 child_killer : Box < dyn ChildKiller + Send + Sync > ,
35- exit_status : Arc < OnceLock < std :: io :: Result < ExitStatus > > > ,
37+ exit_status : Arc < OnceLock < ChildWaitResult > > ,
3638}
3739
3840impl Clone for ChildHandle {
@@ -226,10 +228,10 @@ impl ChildHandle {
226228 ///
227229 /// Returns an error if waiting for the child process exit status fails.
228230 #[ must_use]
229- pub fn wait ( & self ) -> std :: io :: Result < ExitStatus > {
231+ pub fn wait ( & self ) -> anyhow :: Result < ExitStatus > {
230232 match self . exit_status . wait ( ) {
231233 Ok ( status) => Ok ( status. clone ( ) ) ,
232- Err ( error) => Err ( std :: io :: Error :: new ( error . kind ( ) , error. to_string ( ) ) ) ,
234+ Err ( error) => Err ( anyhow :: Error :: new ( Arc :: clone ( error) ) ) ,
233235 }
234236 }
235237
@@ -270,14 +272,14 @@ impl Terminal {
270272 let child_killer = child. clone_killer ( ) ;
271273 drop ( pty_pair. slave ) ; // Critical: drop slave so EOF is signaled when child exits
272274 let master = pty_pair. master ;
273- let exit_status: Arc < OnceLock < std :: io :: Result < ExitStatus > > > = Arc :: new ( OnceLock :: new ( ) ) ;
275+ let exit_status: Arc < OnceLock < ChildWaitResult > > = Arc :: new ( OnceLock :: new ( ) ) ;
274276
275277 // Background thread: wait for child to exit, set exit status, then close writer to trigger EOF
276278 thread:: spawn ( {
277279 let writer = Arc :: clone ( & writer) ;
278280 let exit_status = Arc :: clone ( & exit_status) ;
279281 move || {
280- let _ = exit_status. set ( child. wait ( ) ) ;
282+ let _ = exit_status. set ( child. wait ( ) . map_err ( Arc :: new ) ) ;
281283 // Close writer to signal EOF to the reader
282284 * writer. lock ( ) . unwrap ( ) = None ;
283285 }
0 commit comments