Skip to content

Commit

Permalink
Update to magenta-rs 0.2. (tokio-rs#646)
Browse files Browse the repository at this point in the history
This update also enabled making EventedHandle non-generic.
  • Loading branch information
cramertj authored and alexcrichton committed Aug 12, 2017
1 parent 987efbb commit 156f38b
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 48 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
11 changes: 6 additions & 5 deletions src/sys/fuchsia/eventedfd.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
36 changes: 14 additions & 22 deletions src/sys/fuchsia/handles.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -47,7 +39,7 @@ impl<T> Evented for EventedHandle<T> 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(())
Expand All @@ -61,9 +53,9 @@ impl<T> Evented for EventedHandle<T> 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(())
Expand All @@ -77,7 +69,7 @@ impl<T> Evented for EventedHandle<T> 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(())
Expand Down
45 changes: 28 additions & 17 deletions src/sys/fuchsia/selector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {
Expand All @@ -280,31 +281,41 @@ impl Selector {
})
}

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
}
}

Expand Down
4 changes: 2 additions & 2 deletions test/test_fuchsia_handles.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();

Expand Down

0 comments on commit 156f38b

Please sign in to comment.