diff options
| author | kennytm <kennytm@gmail.com> | 2018-02-14 16:14:46 +0800 |
|---|---|---|
| committer | kennytm <kennytm@gmail.com> | 2018-02-14 18:25:26 +0800 |
| commit | 526e9548dc087926aabcfe50f76c393ade09d732 (patch) | |
| tree | 526dbe1ee33900ad8621f02d19ab42aff5653bc0 | |
| parent | 92c66b78c829afe1c0958c5e96ec3b18b67a4667 (diff) | |
| parent | 4c658f76c1b51ced4f6c30ea37441c4141659b93 (diff) | |
| download | rust-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.rs | 24 |
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(()) } } |
