Rollup merge of #50726 - udoprog:read2-inner-fn, r=alexcrichton
read2: Use inner function instead of closure Very minor thing, but there doesn't appear to be a reason to use a closure here. Generated code is identical in my tests, but I believe it's clearer that nothing from the environment is being used.
This commit is contained in:
commit
fc6c08e799
1 changed files with 19 additions and 18 deletions
|
@ -100,24 +100,6 @@ pub fn read2(p1: AnonPipe,
|
||||||
// wait for either pipe to become readable using `poll`
|
// wait for either pipe to become readable using `poll`
|
||||||
cvt_r(|| unsafe { libc::poll(fds.as_mut_ptr(), 2, -1) })?;
|
cvt_r(|| unsafe { libc::poll(fds.as_mut_ptr(), 2, -1) })?;
|
||||||
|
|
||||||
// Read as much as we can from each pipe, ignoring EWOULDBLOCK or
|
|
||||||
// EAGAIN. If we hit EOF, then this will happen because the underlying
|
|
||||||
// reader will return Ok(0), in which case we'll see `Ok` ourselves. In
|
|
||||||
// this case we flip the other fd back into blocking mode and read
|
|
||||||
// whatever's leftover on that file descriptor.
|
|
||||||
let read = |fd: &FileDesc, dst: &mut Vec<u8>| {
|
|
||||||
match fd.read_to_end(dst) {
|
|
||||||
Ok(_) => Ok(true),
|
|
||||||
Err(e) => {
|
|
||||||
if e.raw_os_error() == Some(libc::EWOULDBLOCK) ||
|
|
||||||
e.raw_os_error() == Some(libc::EAGAIN) {
|
|
||||||
Ok(false)
|
|
||||||
} else {
|
|
||||||
Err(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if fds[0].revents != 0 && read(&p1, v1)? {
|
if fds[0].revents != 0 && read(&p1, v1)? {
|
||||||
p2.set_nonblocking(false)?;
|
p2.set_nonblocking(false)?;
|
||||||
return p2.read_to_end(v2).map(|_| ());
|
return p2.read_to_end(v2).map(|_| ());
|
||||||
|
@ -127,4 +109,23 @@ pub fn read2(p1: AnonPipe,
|
||||||
return p1.read_to_end(v1).map(|_| ());
|
return p1.read_to_end(v1).map(|_| ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read as much as we can from each pipe, ignoring EWOULDBLOCK or
|
||||||
|
// EAGAIN. If we hit EOF, then this will happen because the underlying
|
||||||
|
// reader will return Ok(0), in which case we'll see `Ok` ourselves. In
|
||||||
|
// this case we flip the other fd back into blocking mode and read
|
||||||
|
// whatever's leftover on that file descriptor.
|
||||||
|
fn read(fd: &FileDesc, dst: &mut Vec<u8>) -> Result<bool, io::Error> {
|
||||||
|
match fd.read_to_end(dst) {
|
||||||
|
Ok(_) => Ok(true),
|
||||||
|
Err(e) => {
|
||||||
|
if e.raw_os_error() == Some(libc::EWOULDBLOCK) ||
|
||||||
|
e.raw_os_error() == Some(libc::EAGAIN) {
|
||||||
|
Ok(false)
|
||||||
|
} else {
|
||||||
|
Err(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue