summary refs log tree commit diff
path: root/msg_socket/src/msg_on_socket.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2020-01-13 01:59:25 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-26 06:20:39 +0000
commit72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df (patch)
treed29b02393eedaedde8608ff7a6abc6efb3124c4e /msg_socket/src/msg_on_socket.rs
parentdfd0139d7cf2935add342c76cec66702800e95b7 (diff)
downloadcrosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar.gz
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar.bz2
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar.lz
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar.xz
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.tar.zst
crosvm-72ccaefe0f384f708b3d2fd71aa3f3b40ab4e3df.zip
msg_socket: Add async receiving of messages
Add a member to MsgSocket that effectively returns an async iterator
over messages received on the socket. This is done by setting the socket
as non-blocking and registering with the async infrastructure when the
socket would block.

This feature will be used by devices that wish to handle messages in an
async fn context.

Change-Id: I47c6e83922068820cd19ffd9ef604ed8a16b755e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1997243
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Tested-by: Dylan Reid <dgreid@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'msg_socket/src/msg_on_socket.rs')
-rw-r--r--msg_socket/src/msg_on_socket.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs
index 2924dc6..f03c36f 100644
--- a/msg_socket/src/msg_on_socket.rs
+++ b/msg_socket/src/msg_on_socket.rs
@@ -15,6 +15,8 @@ use sys_util::{Error as SysError, EventFd};
 #[derive(Debug, PartialEq)]
 /// An error during transaction or serialization/deserialization.
 pub enum MsgError {
+    /// Error adding a waker for async read.
+    AddingWaker(cros_async::fd_executor::Error),
     /// Error while sending a request or response.
     Send(SysError),
     /// Error while receiving a request or response.
@@ -28,6 +30,8 @@ pub enum MsgError {
     ExpectFd,
     /// There was some associated file descriptor received but not used when deserialize.
     NotExpectFd,
+    /// Failed to set flags on the file descriptor.
+    SettingFdFlags(SysError),
     /// Trying to serialize/deserialize, but fd buffer size is too small. This typically happens
     /// when max_fd_count() returns a value that is too small.
     WrongFdBufferSize,
@@ -43,6 +47,7 @@ impl Display for MsgError {
         use self::MsgError::*;
 
         match self {
+            AddingWaker(e) => write!(f, "failed to add a waker: {}", e),
             Send(e) => write!(f, "failed to send request or response: {}", e),
             Recv(e) => write!(f, "failed to receive request or response: {}", e),
             InvalidType => write!(f, "invalid type"),
@@ -53,6 +58,7 @@ impl Display for MsgError {
             ),
             ExpectFd => write!(f, "missing associated file descriptor for request"),
             NotExpectFd => write!(f, "unexpected file descriptor is unused"),
+            SettingFdFlags(e) => write!(f, "failed setting flags on the message FD: {}", e),
             WrongFdBufferSize => write!(f, "fd buffer size too small"),
             WrongMsgBufferSize => write!(f, "msg buffer size too small"),
         }