summary refs log tree commit diff
path: root/sys_util/src/poll.rs
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2018-02-27 22:22:35 -0800
committerchrome-bot <chrome-bot@chromium.org>2018-03-07 16:54:46 -0800
commit25c6bc137ecfd1f608993a3d2f24c5736c5c186a (patch)
tree8fb7b1cfa49bddbadf4f059e7508c5a7ee5b730f /sys_util/src/poll.rs
parenta5358e8ffd53d04750dc2c3376abc3fb5df92659 (diff)
downloadcrosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.gz
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.bz2
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.lz
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.xz
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.zst
crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.zip
sys_util: custom derive for PollToken
Using an enum implementing PollToken is the recommended way to use
PollContext, but writing the trait impls for each enum is mechanical yet
error prone. This is a perfect candidate for a custom derive, which
automates away the process using a simple derive attribute on an enum.

BUG=chromium:816692
TEST=cargo test -p sys_util

Change-Id: If21d0f94f9af4b4f6cef1f24c78fc36b50471053
Reviewed-on: https://chromium-review.googlesource.com/940865
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Diffstat (limited to 'sys_util/src/poll.rs')
-rw-r--r--sys_util/src/poll.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/sys_util/src/poll.rs b/sys_util/src/poll.rs
index 0a6da7b..762c5e4 100644
--- a/sys_util/src/poll.rs
+++ b/sys_util/src/poll.rs
@@ -150,6 +150,10 @@ impl Poller {
 }
 
 /// Trait for a token that can be associated with an `fd` in a `PollContext`.
+///
+/// Simple enums that have no or primitive variant data data can use the `#[derive(PollToken)]`
+/// custom derive to implement this trait. See
+/// [poll_token_derive::poll_token](../poll_token_derive/fn.poll_token.html) for details.
 pub trait PollToken {
     /// Converts this token into a u64 that can be turned back into a token via `from_raw_token`.
     fn as_raw_token(&self) -> u64;
@@ -670,4 +674,32 @@ mod tests {
         ctx.wait_timeout(dur).unwrap();
         assert!(start_inst.elapsed() >= dur);
     }
+
+    #[test]
+    #[allow(dead_code)]
+    fn poll_token_derive() {
+        #[derive(PollToken)]
+        enum EmptyToken {}
+
+        #[derive(PartialEq, Debug, PollToken)]
+        enum Token {
+            Alpha,
+            Beta,
+            // comments
+            Gamma(u32),
+            Delta { index: usize },
+            Omega,
+        }
+
+        assert_eq!(Token::from_raw_token(Token::Alpha.as_raw_token()),
+                   Token::Alpha);
+        assert_eq!(Token::from_raw_token(Token::Beta.as_raw_token()),
+                   Token::Beta);
+        assert_eq!(Token::from_raw_token(Token::Gamma(55).as_raw_token()),
+                   Token::Gamma(55));
+        assert_eq!(Token::from_raw_token(Token::Delta { index: 100 }.as_raw_token()),
+                   Token::Delta { index: 100 });
+        assert_eq!(Token::from_raw_token(Token::Omega.as_raw_token()),
+                   Token::Omega);
+    }
 }