mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-11 20:56:12 +00:00
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>
This commit is contained in:
parent
9d5e8f34ad
commit
994e418039
1 changed files with 22 additions and 6 deletions
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue