mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-03 13:37:37 +00:00
Use less syscalls in FileDesc::set_{nonblocking,cloexec}
Only set the flags if they differ from what the OS reported, use `FIONBIO` to atomically set the non-blocking IO flag on Linux.
This commit is contained in:
parent
86d9ed6c82
commit
efeb42be28
@ -144,11 +144,24 @@ impl FileDesc {
|
|||||||
pub fn set_cloexec(&self) -> io::Result<()> {
|
pub fn set_cloexec(&self) -> io::Result<()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let previous = cvt(libc::fcntl(self.fd, libc::F_GETFD))?;
|
let previous = cvt(libc::fcntl(self.fd, libc::F_GETFD))?;
|
||||||
cvt(libc::fcntl(self.fd, libc::F_SETFD, previous | libc::FD_CLOEXEC))?;
|
let new = previous | libc::FD_CLOEXEC;
|
||||||
|
if new != previous {
|
||||||
|
cvt(libc::fcntl(self.fd, libc::F_SETFD, new))?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
|
||||||
|
unsafe {
|
||||||
|
let v = nonblocking as c_int;
|
||||||
|
cvt(libc::ioctl(self.fd, libc::FIONBIO, &v))?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
|
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let previous = cvt(libc::fcntl(self.fd, libc::F_GETFL))?;
|
let previous = cvt(libc::fcntl(self.fd, libc::F_GETFL))?;
|
||||||
@ -157,7 +170,9 @@ impl FileDesc {
|
|||||||
} else {
|
} else {
|
||||||
previous & !libc::O_NONBLOCK
|
previous & !libc::O_NONBLOCK
|
||||||
};
|
};
|
||||||
cvt(libc::fcntl(self.fd, libc::F_SETFL, new))?;
|
if new != previous {
|
||||||
|
cvt(libc::fcntl(self.fd, libc::F_SETFL, new))?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user