Update to magenta-rs 0.2. (#646)
This update also enabled making EventedHandle non-generic.
diff --git a/Cargo.toml b/Cargo.toml
index 047dc2e..258dc34 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,8 +29,8 @@
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 33e5930..e337666 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 @@
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 fc70c15..ee24566 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<T> 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<Option<Token>>,
}
-impl<T> EventedHandle<T> 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<T> Evented for EventedHandle<T> where T: HandleBase {
+impl Evented for EventedHandle {
fn register(&self,
poll: &Poll,
token: Token,
@@ -47,7 +39,7 @@
{
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 @@
{
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 @@
"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 d0a8707..293d576 100644
--- a/src/sys/fuchsia/selector.rs
+++ b/src/sys/fuchsia/selector.rs
@@ -9,7 +9,8 @@
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 @@
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 @@
})
}
- pub fn register_handle<H>(&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<H>(&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 26fd974..589471f 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 @@
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();