From 68795702ce7ee5ee4b1ea1eb3550659324a148e1 Mon Sep 17 00:00:00 2001 From: Tobias Breitwieser Date: Tue, 3 Oct 2023 01:38:36 +0200 Subject: [PATCH 1/2] only log errors with power switching not erroring out --- teleprobe/src/probe/mod.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/teleprobe/src/probe/mod.rs b/teleprobe/src/probe/mod.rs index bb69266..de53ca3 100644 --- a/teleprobe/src/probe/mod.rs +++ b/teleprobe/src/probe/mod.rs @@ -60,7 +60,9 @@ pub fn connect(opts: &Opts) -> Result { bail!("power reset requires a serial number"); } log::debug!("probe power reset"); - power_reset(&probes[0].serial_number.as_ref().unwrap())?; + if let Err(err) = power_reset(&probes[0].serial_number.as_ref().unwrap()){ + log::warn!("power reset failed for: {}", err); + } } probes = get_probe(&opts)?; } @@ -179,7 +181,7 @@ fn power_reset(probe_serial: &str) -> Result<()> { std::thread::sleep(std::time::Duration::from_millis(1000)); Ok(()) } else { - bail!("uhubctl failed: {}", String::from_utf8_lossy(&output.stderr)) + bail!("uhubctl failed for serial \'{}\': {}", probe_serial, String::from_utf8_lossy(&output.stderr)) } } Err(e) => bail!("uhubctl failed: {}", e) From cabb48e323e18646921403b42ed05bce7d999e01 Mon Sep 17 00:00:00 2001 From: Tobias Breitwieser Date: Tue, 3 Oct 2023 02:27:04 +0200 Subject: [PATCH 2/2] primitive uhubctl guard --- teleprobe/src/probe/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/teleprobe/src/probe/mod.rs b/teleprobe/src/probe/mod.rs index de53ca3..962effe 100644 --- a/teleprobe/src/probe/mod.rs +++ b/teleprobe/src/probe/mod.rs @@ -1,11 +1,14 @@ mod specifier; use std::process::Command; +use std::sync::Mutex; use anyhow::{bail, Result}; use clap::Parser; use probe_rs::{DebugProbeInfo, MemoryInterface, Permissions, Probe, Session}; pub use specifier::ProbeSpecifier; +static UHUBCTL_MUTEX: Mutex<()> = Mutex::new(()); + #[derive(Clone, Parser)] pub struct Opts { /// The probe to use (specified by eg. `VID:PID`, `VID:PID:Serial`, or just `Serial`). @@ -168,12 +171,14 @@ pub fn probes_filter(probes: &[DebugProbeInfo], selector: &ProbeSpecifier) -> Ve #[cfg(feature = "power_reset")] fn power_reset(probe_serial: &str) -> Result<()> { + let _guard = UHUBCTL_MUTEX.lock(); let output = Command::new("uhubctl") .arg("-a") .arg("cycle") .arg("-s") .arg(probe_serial) .output(); + drop(_guard); match output { Ok(output) => {