From 1ed971edbac23f22ec743d9cfa55994a4226b01e Mon Sep 17 00:00:00 2001 From: sapan Date: Thu, 10 Jul 2025 18:53:54 -0400 Subject: [PATCH 1/3] refactor: streamline stdout and stderr handling in process managers --- .../src/process_manager_trait.rs | 9 ++++++--- .../src/unix_process_manager.rs | 18 ++---------------- .../src/windows_process_manager.rs | 19 ++----------------- 3 files changed, 10 insertions(+), 36 deletions(-) diff --git a/crates/gpmcp-layer-core/src/process_manager_trait.rs b/crates/gpmcp-layer-core/src/process_manager_trait.rs index 90994c5..791f2e1 100644 --- a/crates/gpmcp-layer-core/src/process_manager_trait.rs +++ b/crates/gpmcp-layer-core/src/process_manager_trait.rs @@ -198,11 +198,14 @@ impl Decoder for Utf8Codec { } } pub async fn stream( - io: &mut A, + io: Option, out: impl Into, ) -> tokio::io::Result<()> { - let mut frames = FramedRead::with_capacity(io, Utf8Codec, 1024); - stream_frames(&mut frames, out.into()).await + if let Some(io) = io { + let mut frames = FramedRead::with_capacity(io, Utf8Codec, 1024); + return stream_frames(&mut frames, out.into()).await; + } + Ok(()) } async fn stream_frames( diff --git a/crates/gpmcp-layer-unix/src/unix_process_manager.rs b/crates/gpmcp-layer-unix/src/unix_process_manager.rs index a22118c..cdec065 100644 --- a/crates/gpmcp-layer-unix/src/unix_process_manager.rs +++ b/crates/gpmcp-layer-unix/src/unix_process_manager.rs @@ -216,23 +216,9 @@ impl ProcessManager for UnixProcessManager { ); } - // Capture and stream stdout - the stream function will detect it's stdout and route accordingly - if let Some(mut stdout) = child.stdout.take() { - tokio::spawn(async move { - if let Err(e) = stream(&mut stdout, out).await { - warn!("Error streaming stdout: {}", e); - } - }); - } + let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); - // Capture and stream stderr - the stream function will detect it's stderr and route accordingly - if let Some(mut stderr) = child.stderr.take() { - tokio::spawn(async move { - if let Err(e) = stream(&mut stderr, err).await { - warn!("Error streaming stderr: {}", e); - } - }); - } + let _ = tokio::join!(stream(stdout, out), stream(stderr, err)); Ok(UnixProcessHandle::new(child, command.to_string())) } } diff --git a/crates/gpmcp-layer-windows/src/windows_process_manager.rs b/crates/gpmcp-layer-windows/src/windows_process_manager.rs index 96d86ca..b8708c3 100644 --- a/crates/gpmcp-layer-windows/src/windows_process_manager.rs +++ b/crates/gpmcp-layer-windows/src/windows_process_manager.rs @@ -275,24 +275,9 @@ impl ProcessManager for WindowsProcessManager { ); } - // Capture and stream stdout - the stream function will detect it's stdout and route accordingly - if let Some(mut stdout) = child.stdout.take() { - tokio::spawn(async move { - if let Err(e) = stream(&mut stdout, out).await { - warn!("Error streaming stdout: {}", e); - } - }); - } - - // Capture and stream stderr - the stream function will detect it's stderr and route accordingly - if let Some(mut stderr) = child.stderr.take() { - tokio::spawn(async move { - if let Err(e) = stream(&mut stderr, err).await { - warn!("Error streaming stderr: {}", e); - } - }); - } + let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); + let _ = tokio::join!(stream(stdout, out), stream(stderr, err)); Ok(WindowsProcessHandle::new(child, command.to_string())) } } From e5a8f5b319326aca0878996960f05cd50c51525b Mon Sep 17 00:00:00 2001 From: Sandipsinh Rathod Date: Thu, 10 Jul 2025 19:07:50 -0400 Subject: [PATCH 2/3] refactor: replace tokio::join! with tokio::try_join! for improved error handling in process managers --- crates/gpmcp-layer-unix/src/unix_process_manager.rs | 4 +++- crates/gpmcp-layer-windows/src/windows_process_manager.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/gpmcp-layer-unix/src/unix_process_manager.rs b/crates/gpmcp-layer-unix/src/unix_process_manager.rs index cdec065..690cbbb 100644 --- a/crates/gpmcp-layer-unix/src/unix_process_manager.rs +++ b/crates/gpmcp-layer-unix/src/unix_process_manager.rs @@ -218,7 +218,9 @@ impl ProcessManager for UnixProcessManager { let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); - let _ = tokio::join!(stream(stdout, out), stream(stderr, err)); + tokio::spawn(async move { + tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() + }); Ok(UnixProcessHandle::new(child, command.to_string())) } } diff --git a/crates/gpmcp-layer-windows/src/windows_process_manager.rs b/crates/gpmcp-layer-windows/src/windows_process_manager.rs index b8708c3..6900c11 100644 --- a/crates/gpmcp-layer-windows/src/windows_process_manager.rs +++ b/crates/gpmcp-layer-windows/src/windows_process_manager.rs @@ -277,7 +277,9 @@ impl ProcessManager for WindowsProcessManager { let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); - let _ = tokio::join!(stream(stdout, out), stream(stderr, err)); + tokio::spawn(async move { + tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() + }); Ok(WindowsProcessHandle::new(child, command.to_string())) } } From 1fbe5663d84a17660694c8d41a7ab4ff5690a86c Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 23:08:31 +0000 Subject: [PATCH 3/3] [autofix.ci] apply automated fixes --- crates/gpmcp-layer-unix/src/unix_process_manager.rs | 6 +++--- crates/gpmcp-layer-windows/src/windows_process_manager.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/gpmcp-layer-unix/src/unix_process_manager.rs b/crates/gpmcp-layer-unix/src/unix_process_manager.rs index 690cbbb..8933a98 100644 --- a/crates/gpmcp-layer-unix/src/unix_process_manager.rs +++ b/crates/gpmcp-layer-unix/src/unix_process_manager.rs @@ -218,9 +218,9 @@ impl ProcessManager for UnixProcessManager { let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); - tokio::spawn(async move { - tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() - }); + tokio::spawn( + async move { tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() }, + ); Ok(UnixProcessHandle::new(child, command.to_string())) } } diff --git a/crates/gpmcp-layer-windows/src/windows_process_manager.rs b/crates/gpmcp-layer-windows/src/windows_process_manager.rs index 6900c11..9a03b3f 100644 --- a/crates/gpmcp-layer-windows/src/windows_process_manager.rs +++ b/crates/gpmcp-layer-windows/src/windows_process_manager.rs @@ -277,9 +277,9 @@ impl ProcessManager for WindowsProcessManager { let (stdout, stderr) = (child.stdout.take(), child.stderr.take()); - tokio::spawn(async move { - tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() - }); + tokio::spawn( + async move { tokio::try_join!(stream(stdout, out), stream(stderr, err)).ok() }, + ); Ok(WindowsProcessHandle::new(child, command.to_string())) } }