From 2fb4b6ace860a485be8afdf3ed523ab5f1f616c8 Mon Sep 17 00:00:00 2001 From: Erik Schilling Date: Fri, 7 Jul 2023 12:23:28 +0200 Subject: [PATCH] tree-wide: continue unwinds on join failures The error from joining a thread is a bit confusing. It is only printed if the other thread panicked. This means, effectively, we only get here if something called .unwrap(), .expect() or panicked in a different way. In these cases an (ugly) error was already printend. Printing a pretty message about the join failure does not really help a lot... So let's just continue the unwind as suggested by the docs on the join `Result` [1]. Before: thread '' panicked at 'Test panic', crates/gpio/src/backend.rs:146:13 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Any { .. }', crates/gpio/src/backend.rs:176:23 After: thread '' panicked at 'Test panic', crates/gpio/src/backend.rs:146:13 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace [1]: https://doc.rust-lang.org/std/thread/type.Result.html Signed-off-by: Erik Schilling --- vhost-device-gpio/src/backend.rs | 4 +--- vhost-device-i2c/src/main.rs | 4 +--- vhost-device-rng/src/main.rs | 4 +--- vhost-device-vsock/src/main.rs | 7 ++++++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/vhost-device-gpio/src/backend.rs b/vhost-device-gpio/src/backend.rs index e1e28152d..42dbdfc10 100644 --- a/vhost-device-gpio/src/backend.rs +++ b/vhost-device-gpio/src/backend.rs @@ -36,8 +36,6 @@ pub(crate) enum Error { DeviceDuplicate(u32), #[error("Failed while parsing to integer: {0:?}")] ParseFailure(ParseIntError), - #[error("Failed to join threads")] - FailedJoiningThreads, #[error("Could not open gpio device: {0}")] CouldNotOpenDevice(crate::gpio::Error), #[error("Could not create gpio controller: {0}")] @@ -227,7 +225,7 @@ fn start_backend(args: GpioArgs) -> Result<()> { } for handle in handles { - handle.join().map_err(|_| Error::FailedJoiningThreads)??; + handle.join().map_err(std::panic::resume_unwind).unwrap()?; } Ok(()) diff --git a/vhost-device-i2c/src/main.rs b/vhost-device-i2c/src/main.rs index eb838a09a..5b2712ffa 100644 --- a/vhost-device-i2c/src/main.rs +++ b/vhost-device-i2c/src/main.rs @@ -39,8 +39,6 @@ pub(crate) enum Error { I2cFailure(i2c::Error), #[error("Failed while parsing to integer: {0:?}")] ParseFailure(ParseIntError), - #[error("Failed to join threads")] - FailedJoiningThreads, #[error("Could not create backend: {0}")] CouldNotCreateBackend(vhu_i2c::Error), #[error("Could not create daemon: {0}")] @@ -215,7 +213,7 @@ fn start_backend(args: I2cArgs) -> Result< } for handle in handles { - handle.join().map_err(|_| Error::FailedJoiningThreads)??; + handle.join().map_err(std::panic::resume_unwind).unwrap()?; } Ok(()) diff --git a/vhost-device-rng/src/main.rs b/vhost-device-rng/src/main.rs index b639aa528..a0e09a292 100644 --- a/vhost-device-rng/src/main.rs +++ b/vhost-device-rng/src/main.rs @@ -33,8 +33,6 @@ pub(crate) enum Error { InvalidPeriodInput(u128), #[error("Wrong socket count: {0}")] InvalidSocketCount(u32), - #[error("Threads can't be joined")] - FailedJoiningThreads, #[error("Could not create backend: {0}")] CouldNotCreateBackend(std::io::Error), #[error("Could not create daemon: {0}")] @@ -139,7 +137,7 @@ pub(crate) fn start_backend(config: VuRngConfig) -> Result<()> { } for handle in handles { - handle.join().map_err(|_| Error::FailedJoiningThreads)??; + handle.join().map_err(std::panic::resume_unwind).unwrap()?; } Ok(()) diff --git a/vhost-device-vsock/src/main.rs b/vhost-device-vsock/src/main.rs index 293779e10..d8858df11 100644 --- a/vhost-device-vsock/src/main.rs +++ b/vhost-device-vsock/src/main.rs @@ -281,7 +281,12 @@ pub(crate) fn start_backend_servers(configs: &[VsockConfig]) -> Result<(), Backe while !handles.is_empty() { let thread_id = receiver.recv().unwrap(); - handles.remove(&thread_id).unwrap().join().unwrap()?; + handles + .remove(&thread_id) + .unwrap() + .join() + .map_err(std::panic::resume_unwind) + .unwrap()?; } Ok(())