diff options
author | Zach Reizner <zachr@google.com> | 2020-03-25 01:16:38 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-05-05 15:46:45 +0000 |
commit | 8b3ee41b302d5d99da917c3b21037135d1665b75 (patch) | |
tree | 32a212cabb6dead1096f6ca33780ccba58470f15 /msg_socket/src/msg_on_socket.rs | |
parent | 34c00465d5eba814b9eeebf8971f4667e7f1f75d (diff) | |
download | crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar.gz crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar.bz2 crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar.lz crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar.xz crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.tar.zst crosvm-8b3ee41b302d5d99da917c3b21037135d1665b75.zip |
msg_socket: impl for Arc and Mutex
These types are simple wrappers, and so this change just adds trivial passthroughs. For data sent over a socket, the data is not Arc-ed or Mutex-ed on the other end with the same ref count or lock. Sending over the data is more like a deep copy, rather than a simple ref count increase. TEST=cargo test -p msg_socket BUG=None Change-Id: I519096b0b3b6ab75e79c37addf0d60ce3da4a717 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2168586 Commit-Queue: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'msg_socket/src/msg_on_socket.rs')
-rw-r--r-- | msg_socket/src/msg_on_socket.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs index b925630..097bc48 100644 --- a/msg_socket/src/msg_on_socket.rs +++ b/msg_socket/src/msg_on_socket.rs @@ -10,8 +10,10 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; use std::ptr::drop_in_place; use std::result; +use std::sync::Arc; use data_model::*; +use sync::Mutex; use sys_util::{Error as SysError, EventFd}; #[derive(Debug, PartialEq)] @@ -209,6 +211,50 @@ impl<T: MsgOnSocket> MsgOnSocket for Option<T> { } } +impl<T: MsgOnSocket> MsgOnSocket for Mutex<T> { + fn uses_fd() -> bool { + T::uses_fd() + } + + fn msg_size(&self) -> usize { + self.lock().msg_size() + } + + fn fd_count(&self) -> usize { + self.lock().fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + T::read_from_buffer(buffer, fds).map(|(v, count)| (Mutex::new(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + self.lock().write_to_buffer(buffer, fds) + } +} + +impl<T: MsgOnSocket> MsgOnSocket for Arc<T> { + fn uses_fd() -> bool { + T::uses_fd() + } + + fn msg_size(&self) -> usize { + (**self).msg_size() + } + + fn fd_count(&self) -> usize { + (**self).fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + T::read_from_buffer(buffer, fds).map(|(v, count)| (Arc::new(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + (**self).write_to_buffer(buffer, fds) + } +} + impl MsgOnSocket for () { fn fixed_size() -> Option<usize> { Some(0) |