diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-02-26 15:44:13 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-02-26 15:44:13 -0500 |
commit | 07ed5629fff12ccb95216f7b07c91bb6e8bbfbc7 (patch) | |
tree | 2e6e6628cb7bbef52e8eeb66a90e69562d2ad09a /src/runner/builtins/mod.rs | |
parent | 6015f1000e09e72d1355105921294e2c37cf1fc2 (diff) | |
download | nbsh-07ed5629fff12ccb95216f7b07c91bb6e8bbfbc7.tar.gz nbsh-07ed5629fff12ccb95216f7b07c91bb6e8bbfbc7.zip |
remove the mutex for builtin fds
Diffstat (limited to 'src/runner/builtins/mod.rs')
-rw-r--r-- | src/runner/builtins/mod.rs | 80 |
1 files changed, 19 insertions, 61 deletions
diff --git a/src/runner/builtins/mod.rs b/src/runner/builtins/mod.rs index 87b5ae7..f212496 100644 --- a/src/runner/builtins/mod.rs +++ b/src/runner/builtins/mod.rs @@ -7,7 +7,7 @@ type Builtin = &'static (dyn for<'a> Fn( crate::parse::Exe, &'a Env, command::Cfg, -) -> anyhow::Result<command::Child<'a>> +) -> anyhow::Result<command::Child> + Sync + Send); @@ -33,7 +33,6 @@ macro_rules! bail { $cfg.io().write_stderr( format!("{}: {}\n", $exe.exe().display(), $msg).as_bytes() ) - .await .unwrap(); return std::process::ExitStatus::from_raw(1 << 8); }; @@ -41,12 +40,10 @@ macro_rules! bail { $cfg.io().write_stderr( format!("{}: ", $exe.exe().display()).as_bytes() ) - .await .unwrap(); $cfg.io().write_stderr(format!($msg, $($arg)*).as_bytes()) - .await .unwrap(); - $cfg.io().write_stderr(b"\n").await.unwrap(); + $cfg.io().write_stderr(b"\n").unwrap(); return std::process::ExitStatus::from_raw(1 << 8); }; } @@ -58,21 +55,19 @@ fn cd( env: &Env, cfg: command::Cfg, ) -> anyhow::Result<command::Child> { - async fn async_cd( - exe: crate::parse::Exe, - env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { + let prev_pwd = env.prev_pwd(); + let home = env.var("HOME"); + Ok(command::Child::new_task(move || { let dir = if let Some(dir) = exe.args().get(0) { if dir.is_empty() { ".".to_string().into() } else if dir == "-" { - env.prev_pwd() + prev_pwd } else { dir.into() } } else { - let dir = env.var("HOME"); + let dir = home; if let Some(dir) = dir { dir.into() } else { @@ -89,24 +84,16 @@ fn cd( ); } std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_cd(exe, env, cfg).await })) } #[allow(clippy::unnecessary_wraps)] fn set( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, ) -> anyhow::Result<command::Child> { - async fn async_set( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { + Ok(command::Child::new_task(move || { let k = if let Some(k) = exe.args().get(0).map(String::as_str) { k } else { @@ -120,24 +107,16 @@ fn set( std::env::set_var(k, v); std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_set(exe, env, cfg).await })) } #[allow(clippy::unnecessary_wraps)] fn unset( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, ) -> anyhow::Result<command::Child> { - async fn async_unset( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { + Ok(command::Child::new_task(move || { let k = if let Some(k) = exe.args().get(0).map(String::as_str) { k } else { @@ -146,10 +125,6 @@ fn unset( std::env::remove_var(k); std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_unset(exe, env, cfg).await })) } @@ -159,20 +134,15 @@ fn unset( // this later, since the binary seems totally fine fn echo( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, ) -> anyhow::Result<command::Child> { - async fn async_echo( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { + Ok(command::Child::new_task(move || { macro_rules! write_stdout { ($bytes:expr) => { - if let Err(e) = cfg.io().write_stdout($bytes).await { + if let Err(e) = cfg.io().write_stdout($bytes) { cfg.io() .write_stderr(format!("echo: {}", e).as_bytes()) - .await .unwrap(); return std::process::ExitStatus::from_raw(1 << 8); } @@ -189,31 +159,23 @@ fn echo( } std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_echo(exe, env, cfg).await })) } #[allow(clippy::unnecessary_wraps)] fn read( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, ) -> anyhow::Result<command::Child> { - async fn async_read( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { + Ok(command::Child::new_task(move || { let var = if let Some(var) = exe.args().get(0).map(String::as_str) { var } else { bail!(cfg, exe, "usage: read var"); }; - let (val, done) = match cfg.io().read_line_stdin().await { + let (val, done) = match cfg.io().read_line_stdin() { Ok((line, done)) => (line, done), Err(e) => { bail!(cfg, exe, e); @@ -222,10 +184,6 @@ fn read( std::env::set_var(var, val); std::process::ExitStatus::from_raw(if done { 1 << 8 } else { 0 }) - } - - Ok(command::Child::new_fut(async move { - async_read(exe, env, cfg).await })) } @@ -241,7 +199,7 @@ fn and( Ok(command::Child::new_wrapped(cmd.spawn(env)?)) } else { let status = env.latest_status(); - Ok(command::Child::new_fut(async move { status })) + Ok(command::Child::new_task(move || status)) } } @@ -253,7 +211,7 @@ fn or( exe.shift(); if env.latest_status().success() { let status = env.latest_status(); - Ok(command::Child::new_fut(async move { status })) + Ok(command::Child::new_task(move || status)) } else { let mut cmd = crate::runner::Command::new(exe, cfg.io().clone()); cfg.setup_command(&mut cmd); |