about summary refs log tree commit diff
path: root/library/std/src/sys/unix/process/process_fuchsia.rs
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-12-17 23:44:26 +0100
committerGitHub <noreply@github.com>2022-12-17 23:44:26 +0100
commit6d1cdcaee52e357dfb3500091bdd18a2e0c763ff (patch)
tree8c77db364a89edb08e1552ac86b4d74a6baae5a1 /library/std/src/sys/unix/process/process_fuchsia.rs
parent5dc0b6ff6d76cefa32b1393800067c743f163dcc (diff)
parenta94793d8d17e4cfe2e727c30c36e174b8d6b6ee3 (diff)
downloadrust-6d1cdcaee52e357dfb3500091bdd18a2e0c763ff.tar.gz
rust-6d1cdcaee52e357dfb3500091bdd18a2e0c763ff.zip
Rollup merge of #105458 - Ayush1325:blocking_spawn, r=Mark-Simulacrum
Allow blocking `Command::output`

### Problem
Currently, `Command::output` is internally implemented using `Command::spawn`. This is problematic because some targets (like UEFI) do not actually support multitasking and thus block while the program is executing. This coupling does not make much sense as `Command::output` is supposed to block until the execution is complete anyway and thus does not need to rely on a non-blocking `Child` or any other intermediate.

### Solution
This PR moves the implementation of `Command::output` to `std::sys`. This means targets can choose to implement only `Command::output` without having to implement `Command::spawn`.

### Additional Information

This was originally conceived when working on https://github.com/rust-lang/rust/pull/100316. Currently, the only target I know about that will benefit from this change is UEFI.

This PR can also be used to implement more efficient `Command::output` since the intermediate `Process` is not actually needed anymore, but that is outside the scope of this PR.

Since this is not a public API change, I'm not sure if an RFC is needed or not.
Diffstat (limited to 'library/std/src/sys/unix/process/process_fuchsia.rs')
-rw-r--r--library/std/src/sys/unix/process/process_fuchsia.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/library/std/src/sys/unix/process/process_fuchsia.rs b/library/std/src/sys/unix/process/process_fuchsia.rs
index 66ea3db2015..4c99d758c93 100644
--- a/library/std/src/sys/unix/process/process_fuchsia.rs
+++ b/library/std/src/sys/unix/process/process_fuchsia.rs
@@ -35,6 +35,11 @@ impl Command {
         Ok((Process { handle: Handle::new(process_handle) }, ours))
     }
 
+    pub fn output(&mut self) -> io::Result<(ExitStatus, Vec<u8>, Vec<u8>)> {
+        let (proc, pipes) = self.spawn(Stdio::MakePipe, false)?;
+        crate::sys_common::process::wait_with_output(proc, pipes)
+    }
+
     pub fn exec(&mut self, default: Stdio) -> io::Error {
         if self.saw_nul() {
             return io::const_io_error!(