summary refs log tree commit diff
path: root/msg_socket/src/lib.rs
diff options
context:
space:
mode:
authorJingkui Wang <jkwang@google.com>2018-11-01 16:28:57 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-11-02 14:50:47 -0700
commit994e418039e514acde8d31a593d18f0595fc1442 (patch)
tree81cb8c2d83f15cf7ed0014c0014cc780db665140 /msg_socket/src/lib.rs
parent9d5e8f34ade78222a8a4ab0a6fb259e2c2d1faa3 (diff)
downloadcrosvm-994e418039e514acde8d31a593d18f0595fc1442.tar
crosvm-994e418039e514acde8d31a593d18f0595fc1442.tar.gz
crosvm-994e418039e514acde8d31a593d18f0595fc1442.tar.bz2
crosvm-994e418039e514acde8d31a593d18f0595fc1442.tar.lz
crosvm-994e418039e514acde8d31a593d18f0595fc1442.tar.xz
crosvm-994e418039e514acde8d31a593d18f0595fc1442.tar.zst
crosvm-994e418039e514acde8d31a593d18f0595fc1442.zip
msg_socket: avoid send_msg/recv_msg call if it's not necessary
This patch avoids sendmsg/recvmsg if there is no fd.

BUG=chromium:900962
TEST=build local image and test

Change-Id: I3a5fd52232dc7d98dacd78aa0b383a436056ffb7
Reviewed-on: https://chromium-review.googlesource.com/1313656
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Jingkui Wang <jkwang@google.com>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'msg_socket/src/lib.rs')
-rw-r--r--msg_socket/src/lib.rs28
1 files changed, 22 insertions, 6 deletions
diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs
index f868b19..c4d60df 100644
--- a/msg_socket/src/lib.rs
+++ b/msg_socket/src/lib.rs
@@ -6,14 +6,16 @@
 #[macro_use]
 extern crate msg_on_socket_derive;
 extern crate data_model;
+#[macro_use]
 extern crate sys_util;
 
 mod msg_on_socket;
 
+use std::io::Result;
 use std::marker::PhantomData;
 use std::os::unix::io::RawFd;
 use std::os::unix::net::UnixDatagram;
-use sys_util::{ScmSocket, UnlinkUnixDatagram};
+use sys_util::{Error as SysError, ScmSocket, UnlinkUnixDatagram};
 
 pub use msg_on_socket::*;
 pub use msg_on_socket_derive::*;
@@ -143,8 +145,13 @@ pub trait MsgSender<M: MsgOnSocket>: AsRef<UnixDatagram> {
 
         let fd_size = msg.write_to_buffer(&mut msg_buffer, &mut fd_buffer)?;
         let sock: &UnixDatagram = self.as_ref();
-        sock.send_with_fds(&msg_buffer[..], &fd_buffer[0..fd_size])
-            .map_err(|e| MsgError::Send(e))?;
+        if fd_size == 0 {
+            handle_eintr!(sock.send(&msg_buffer))
+                .map_err(|e| MsgError::Send(SysError::new(e.raw_os_error().unwrap_or(0))))?;
+        } else {
+            sock.send_with_fds(&msg_buffer[..], &fd_buffer[0..fd_size])
+                .map_err(|e| MsgError::Send(e))?;
+        }
         Ok(())
     }
 }
@@ -158,9 +165,18 @@ pub trait MsgReceiver<M: MsgOnSocket>: AsRef<UnixDatagram> {
         let mut fd_buffer: Vec<RawFd> = vec![0; fd_size];
 
         let sock: &UnixDatagram = self.as_ref();
-        let (recv_msg_size, recv_fd_size) = sock
-            .recv_with_fds(&mut msg_buffer, &mut fd_buffer)
-            .map_err(|e| MsgError::Recv(e))?;
+
+        let (recv_msg_size, recv_fd_size) = {
+            if fd_size == 0 {
+                let size = sock
+                    .recv(&mut msg_buffer)
+                    .map_err(|e| MsgError::Recv(SysError::new(e.raw_os_error().unwrap_or(0))))?;
+                (size, 0)
+            } else {
+                sock.recv_with_fds(&mut msg_buffer, &mut fd_buffer)
+                    .map_err(|e| MsgError::Recv(e))?
+            }
+        };
         if msg_size != recv_msg_size {
             return Err(MsgError::BadRecvSize(msg_size));
         }