Skip to content

Commit

Permalink
fix: avoid deadlock in nested shell calls
Browse files Browse the repository at this point in the history
  • Loading branch information
DaniPopes committed Nov 1, 2024
1 parent 7587eb5 commit 50070e4
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions crates/common/src/io/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,15 +132,23 @@ macro_rules! sh_eprintln {
#[macro_export]
macro_rules! __sh_dispatch {
($f:ident $fmt:literal $($args:tt)*) => {
$crate::Shell::$f(&mut *$crate::Shell::get(), ::core::format_args!($fmt $($args)*))
$crate::__sh_dispatch!(@impl $f &mut *$crate::Shell::get(), $fmt $($args)*)
};

($f:ident $shell:expr, $($args:tt)*) => {
$crate::Shell::$f($shell, ::core::format_args!($($args)*))
$crate::__sh_dispatch!(@impl $f $shell, $($args)*)
};

($f:ident $($args:tt)*) => {
$crate::Shell::$f(&mut *$crate::Shell::get(), ::core::format_args!($($args)*))
$crate::__sh_dispatch!(@impl $f &mut *$crate::Shell::get(), $($args)*)
};

// Ensure that the global shell lock is held for as little time as possible.
// Also avoids deadlocks in case of nested calls.
(@impl $f:ident $shell:expr, $($args:tt)*) => {
match ::core::format_args!($($args)*) {
fmt => $crate::Shell::$f($shell, fmt),
}
};
}

Expand Down Expand Up @@ -168,6 +176,11 @@ mod tests {
sh_eprintln!("eprintln")?;
sh_eprintln!("eprintln {}", "arg")?;

sh_println!("{:?}", {
sh_println!("hi")?;
"nested"
})?;

Ok(())
}

Expand Down

0 comments on commit 50070e4

Please sign in to comment.