From 156f38b3c84ceb7ffcb19b3ca3401e24e491a376 Mon Sep 17 00:00:00 2001 From: Taylor Cramer Date: Sat, 12 Aug 2017 10:39:08 -0700 Subject: [PATCH] Update to magenta-rs 0.2. (#646) This update also enabled making EventedHandle non-generic. --- Cargo.toml | 4 ++-- src/sys/fuchsia/eventedfd.rs | 11 +++++---- src/sys/fuchsia/handles.rs | 36 +++++++++++------------------ src/sys/fuchsia/selector.rs | 45 ++++++++++++++++++++++-------------- test/test_fuchsia_handles.rs | 4 ++-- 5 files changed, 52 insertions(+), 48 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 047dc2e4b..258dc34e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,8 @@ net2 = "0.2.29" iovec = "0.1.0" [target.'cfg(target_os = "fuchsia")'.dependencies] -magenta = "0.1.0" -magenta-sys = "0.1.0" +magenta = "0.2.0" +magenta-sys = "0.2.0" [target.'cfg(unix)'.dependencies] libc = "0.2.19" diff --git a/src/sys/fuchsia/eventedfd.rs b/src/sys/fuchsia/eventedfd.rs index 33e593069..e337666b2 100644 --- a/src/sys/fuchsia/eventedfd.rs +++ b/src/sys/fuchsia/eventedfd.rs @@ -1,7 +1,7 @@ use {io, poll, Evented, Ready, Poll, PollOpt, Token}; use libc; use magenta; -use magenta::HandleBase; +use magenta::AsHandleRef; use sys::fuchsia::{DontDrop, poll_opts_to_wait_async, sys}; use std::mem; use std::os::unix::io::RawFd; @@ -56,10 +56,11 @@ impl EventedFdInner { let _res = registration .handle.inner_ref() - .wait_async(port, - registration.token.0 as u64, - rereg_signals, - rereg_opts); + .wait_async_handle( + port, + registration.token.0 as u64, + rereg_signals, + rereg_opts); } } } diff --git a/src/sys/fuchsia/handles.rs b/src/sys/fuchsia/handles.rs index fc70c15c2..ee245667d 100644 --- a/src/sys/fuchsia/handles.rs +++ b/src/sys/fuchsia/handles.rs @@ -1,44 +1,36 @@ use {io, poll, Evented, Ready, Poll, PollOpt, Token}; -use magenta::HandleBase; +use magenta_sys::mx_handle_t; use std::sync::Mutex; /// Wrapper for registering a `HandleBase` type with mio. #[derive(Debug)] -pub struct EventedHandle where T: HandleBase { +pub struct EventedHandle { /// The handle to be registered. - handle: T, + handle: mx_handle_t, /// The current `Token` with which the handle is registered with mio. token: Mutex>, } -impl EventedHandle where T: HandleBase { +impl EventedHandle { /// Create a new `EventedHandle` which can be registered with mio /// in order to receive event notifications. - pub fn new(handle: T) -> Self { + /// + /// The underlying handle must not be + pub unsafe fn new(handle: mx_handle_t) -> Self { EventedHandle { handle: handle, token: Mutex::new(None), } } - /// Get a reference to the underlying `HandleBase`. - pub fn get_ref(&self) -> &T { - &self.handle - } - - /// Get a mutable reference to the underlying `HandleBase`. - pub fn get_mut(&mut self) -> &mut T { - &mut self.handle - } - - /// Convert back into the inner `HandleBase`. - pub fn into_inner(self) -> T { + /// Get the underlying handle being registered. + pub fn get_handle(&self) -> mx_handle_t { self.handle } } -impl Evented for EventedHandle where T: HandleBase { +impl Evented for EventedHandle { fn register(&self, poll: &Poll, token: Token, @@ -47,7 +39,7 @@ impl Evented for EventedHandle where T: HandleBase { { let mut this_token = self.token.lock().unwrap(); { - poll::selector(poll).register_handle(&self.handle, token, interest, opts)?; + poll::selector(poll).register_handle(self.handle, token, interest, opts)?; *this_token = Some(token); } Ok(()) @@ -61,9 +53,9 @@ impl Evented for EventedHandle where T: HandleBase { { let mut this_token = self.token.lock().unwrap(); { - poll::selector(poll).deregister_handle(&self.handle, token)?; + poll::selector(poll).deregister_handle(self.handle, token)?; *this_token = None; - poll::selector(poll).register_handle(&self.handle, token, interest, opts)?; + poll::selector(poll).register_handle(self.handle, token, interest, opts)?; *this_token = Some(token); } Ok(()) @@ -77,7 +69,7 @@ impl Evented for EventedHandle where T: HandleBase { "Attempted to deregister an unregistered handle.")) }; { - poll::selector(poll).deregister_handle(&self.handle, token)?; + poll::selector(poll).deregister_handle(self.handle, token)?; *this_token = None; } Ok(()) diff --git a/src/sys/fuchsia/selector.rs b/src/sys/fuchsia/selector.rs index d0a870768..293d5762d 100644 --- a/src/sys/fuchsia/selector.rs +++ b/src/sys/fuchsia/selector.rs @@ -9,7 +9,8 @@ use sys::fuchsia::{ FuchsiaReady, }; use magenta; -use magenta::HandleBase; +use magenta::AsHandleRef; +use magenta_sys::mx_handle_t; use std::collections::hash_map; use std::fmt; use std::mem; @@ -255,7 +256,7 @@ impl Selector { let wait_async_opts = poll_opts_to_wait_async(poll_opts); - let wait_res = handle.wait_async(&self.port, token.0 as u64, signals, wait_async_opts) + let wait_res = handle.wait_async_handle(&self.port, token.0 as u64, signals, wait_async_opts) .map_err(status_to_io_err); if wait_res.is_err() { @@ -280,31 +281,41 @@ impl Selector { }) } - pub fn register_handle(&self, - handle: &H, - token: Token, - interests: Ready, - poll_opts: PollOpt) -> io::Result<()> - where H: magenta::HandleBase + pub fn register_handle(&self, + handle: mx_handle_t, + token: Token, + interests: Ready, + poll_opts: PollOpt) -> io::Result<()> { if poll_opts.is_level() && !poll_opts.is_oneshot() { return Err(io::Error::new(io::ErrorKind::InvalidInput, "Repeated level-triggered events are not supported on Fuchsia handles.")); } - handle.wait_async(&self.port, - key_from_token_and_type(token, RegType::Handle)?, - FuchsiaReady::from(interests).into_mx_signals(), - poll_opts_to_wait_async(poll_opts)) - .map_err(status_to_io_err) + let temp_handle = unsafe { magenta::Handle::from_raw(handle) }; + + let res = temp_handle.wait_async_handle( + &self.port, + key_from_token_and_type(token, RegType::Handle)?, + FuchsiaReady::from(interests).into_mx_signals(), + poll_opts_to_wait_async(poll_opts)) + .map_err(status_to_io_err); + + mem::forget(temp_handle); + + res } - pub fn deregister_handle(&self, handle: &H, token: Token) -> io::Result<()> - where H: magenta::HandleBase + pub fn deregister_handle(&self, handle: mx_handle_t, token: Token) -> io::Result<()> { - self.port.cancel(handle, key_from_token_and_type(token, RegType::Handle)?) - .map_err(status_to_io_err) + let temp_handle = unsafe { magenta::Handle::from_raw(handle) }; + let res = self.port.cancel(&temp_handle, key_from_token_and_type(token, RegType::Handle)?) + .map_err(status_to_io_err); + + mem::forget(temp_handle); + + res } } diff --git a/test/test_fuchsia_handles.rs b/test/test_fuchsia_handles.rs index 26fd9742a..589471fa1 100644 --- a/test/test_fuchsia_handles.rs +++ b/test/test_fuchsia_handles.rs @@ -1,6 +1,6 @@ use mio::*; use mio::fuchsia::EventedHandle; -use magenta; +use magenta::{self, AsHandleRef}; use std::time::Duration; const MS: u64 = 1_000; @@ -12,7 +12,7 @@ pub fn test_fuchsia_channel() { let event_buffer = &mut event_buffer; let (channel0, channel1) = magenta::Channel::create(magenta::ChannelOpts::Normal).unwrap(); - let channel1_evented = EventedHandle::new(channel1); + let channel1_evented = unsafe { EventedHandle::new(channel1.raw_handle()) }; poll.register(&channel1_evented, Token(1), Ready::readable(), PollOpt::edge()).unwrap();