about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTobias Bucher <tobiasbucher5991@gmail.com>2017-02-04 01:10:12 +0100
committerTobias Bucher <tobiasbucher5991@gmail.com>2017-02-04 01:10:12 +0100
commitefeb42be2837842d1beb47b51bb693c7474aba3d (patch)
tree9ec92a0450eb4ecd354cff5f55195108fdad03dd /src
parent86d9ed6c82c6745fec46b9ecf2fa91be7924dd16 (diff)
downloadrust-efeb42be2837842d1beb47b51bb693c7474aba3d.tar.gz
rust-efeb42be2837842d1beb47b51bb693c7474aba3d.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/libstd/sys/unix/fd.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs
index dcab30aad83..c690fd467ee 100644
--- a/src/libstd/sys/unix/fd.rs
+++ b/src/libstd/sys/unix/fd.rs
@@ -144,11 +144,24 @@ impl FileDesc {
     pub fn set_cloexec(&self) -> io::Result<()> {
         unsafe {
             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(())
+        }
+    }
+
+    #[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<()> {
         unsafe {
             let previous = cvt(libc::fcntl(self.fd, libc::F_GETFL))?;
@@ -157,7 +170,9 @@ impl FileDesc {
             } else {
                 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(())
         }
     }