From 994e418039e514acde8d31a593d18f0595fc1442 Mon Sep 17 00:00:00 2001 From: Jingkui Wang Date: Thu, 1 Nov 2018 16:28:57 -0700 Subject: [PATCH] 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 Tested-by: Jingkui Wang Reviewed-by: Zach Reizner --- msg_socket/src/lib.rs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs index f868b19dc3..c4d60df9dc 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: AsRef { 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: AsRef { let mut fd_buffer: Vec = 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)); }