about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-02-14 16:14:46 +0800
committerkennytm <kennytm@gmail.com>2018-02-14 18:25:26 +0800
commit526e9548dc087926aabcfe50f76c393ade09d732 (patch)
tree526dbe1ee33900ad8621f02d19ab42aff5653bc0
parent92c66b78c829afe1c0958c5e96ec3b18b67a4667 (diff)
parent4c658f76c1b51ced4f6c30ea37441c4141659b93 (diff)
downloadrust-526e9548dc087926aabcfe50f76c393ade09d732.tar.gz
rust-526e9548dc087926aabcfe50f76c393ade09d732.zip
Rollup merge of #48165 - alexcrichton:update-read2, r=Mark-Simulacrum
Update compiletest's `read2` function

This was originally copied over from Cargo and Cargo has since [been
updated][update] so let's pull in the fixes here too!

[update]: https://github.com/rust-lang/cargo/pull/5030
-rw-r--r--src/tools/compiletest/src/read2.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/tools/compiletest/src/read2.rs b/src/tools/compiletest/src/read2.rs
index 1d8816c7db1..486c0d81e3f 100644
--- a/src/tools/compiletest/src/read2.rs
+++ b/src/tools/compiletest/src/read2.rs
@@ -58,9 +58,12 @@ mod imp {
         fds[0].events = libc::POLLIN;
         fds[1].fd = err_pipe.as_raw_fd();
         fds[1].events = libc::POLLIN;
-        loop {
+        let mut nfds = 2;
+        let mut errfd = 1;
+
+        while nfds > 0 {
             // wait for either pipe to become readable using `select`
-            let r = unsafe { libc::poll(fds.as_mut_ptr(), 2, -1) };
+            let r = unsafe { libc::poll(fds.as_mut_ptr(), nfds, -1) };
             if r == -1 {
                 let err = io::Error::last_os_error();
                 if err.kind() == io::ErrorKind::Interrupted {
@@ -86,19 +89,20 @@ mod imp {
                     }
                 }
             };
-            if !out_done && fds[0].revents != 0 && handle(out_pipe.read_to_end(&mut out))? {
-                out_done = true;
-            }
-            data(true, &mut out, out_done);
-            if !err_done && fds[1].revents != 0 && handle(err_pipe.read_to_end(&mut err))? {
+            if !err_done && fds[errfd].revents != 0 && handle(err_pipe.read_to_end(&mut err))? {
                 err_done = true;
+                nfds -= 1;
             }
             data(false, &mut err, err_done);
-
-            if out_done && err_done {
-                return Ok(())
+            if !out_done && fds[0].revents != 0 && handle(out_pipe.read_to_end(&mut out))? {
+                out_done = true;
+                fds[0].fd = err_pipe.as_raw_fd();
+                errfd = 0;
+                nfds -= 1;
             }
+            data(true, &mut out, out_done);
         }
+        Ok(())
     }
 }