Skip to content

Commit 5fbbceb

Browse files
committed
chore: bump Tokio to version 1.x
Remove dependency of mio and use tokio AsyncFd instead. This since tokio no longer exposes mio internals. Also bump MSRV to 1.45, required due to tokio update.
1 parent 246f5ba commit 5fbbceb

File tree

6 files changed

+35
-67
lines changed

6 files changed

+35
-67
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ matrix:
7272

7373
# MSRV
7474
- env: TARGET=x86_64-unknown-linux-gnu DISABLE_TESTS=1
75-
rust: 1.39.0
75+
rust: 1.45.0
7676
if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master)
7777

7878
before_install:

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ Versioning](https://semver.org/spec/v2.0.0.html).
88

99
## [Unreleased]
1010

11+
## v0.5.0
12+
13+
- Update Tokio to 1.x. #[55]((https://github.com/rust-embedded/gpio-cdev/pull/55).
14+
- Breaking change of `LineEventHandle::get_event()` which now expects `&mut self`.
15+
- MSRV is now 1.45.0
16+
17+
1118
## v0.4.0 - 2020-08-01
1219

1320
- Removed pub "errors" module. Error now exposed at top level.

Cargo.toml

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ edition = "2018"
1313

1414
[features]
1515
default = []
16-
async-tokio = ["tokio", "futures", "mio"]
16+
async-tokio = ["tokio", "futures"]
1717

1818
[[example]]
1919
name = "async_tokio"
@@ -23,9 +23,8 @@ required-features = ["async-tokio"]
2323
bitflags = "1.0"
2424
libc = "0.2"
2525
nix = "0.14"
26-
tokio = { version = "0.2", features = ["io-driver", "rt-threaded", "macros"], optional = true }
26+
tokio = { version = "1", features = ["io-std", "rt-multi-thread", "macros", "net"], optional = true }
2727
futures = { version = "0.3", optional = true }
28-
mio = { version = "0.6", optional = true }
2928

3029
[dev-dependencies]
3130
quicli = "0.2"

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ to be considered reliable.
206206

207207
## Minimum Supported Rust Version (MSRV)
208208

209-
This crate is guaranteed to compile on stable Rust 1.39.0 and up. It *might*
209+
This crate is guaranteed to compile on stable Rust 1.45.0 and up. It *might*
210210
compile with older versions but that may change in any new patch release.
211211

212212
## License

src/async_tokio.rs

+18-53
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,14 @@
1111
use futures::ready;
1212
use futures::stream::Stream;
1313
use futures::task::{Context, Poll};
14-
use mio::event::Evented;
15-
use mio::unix::EventedFd;
16-
use mio::{PollOpt, Ready, Token};
17-
use tokio::io::PollEvented;
14+
use tokio::io::unix::{AsyncFd, TryIoError};
1815

19-
use std::io;
2016
use std::os::unix::io::AsRawFd;
2117
use std::pin::Pin;
2218

2319
use super::event_err;
2420
use super::{LineEvent, LineEventHandle, Result};
2521

26-
struct PollWrapper {
27-
handle: LineEventHandle,
28-
}
29-
30-
impl Evented for PollWrapper {
31-
fn register(
32-
&self,
33-
poll: &mio::Poll,
34-
token: Token,
35-
interest: Ready,
36-
opts: PollOpt,
37-
) -> io::Result<()> {
38-
EventedFd(&self.handle.file.as_raw_fd()).register(poll, token, interest, opts)
39-
}
40-
41-
fn reregister(
42-
&self,
43-
poll: &mio::Poll,
44-
token: Token,
45-
interest: Ready,
46-
opts: PollOpt,
47-
) -> io::Result<()> {
48-
EventedFd(&self.handle.file.as_raw_fd()).reregister(poll, token, interest, opts)
49-
}
50-
51-
fn deregister(&self, poll: &mio::Poll) -> io::Result<()> {
52-
EventedFd(&self.handle.file.as_raw_fd()).deregister(poll)
53-
}
54-
}
55-
5622
/// Wrapper around a `LineEventHandle` which implements a `futures::stream::Stream` for interrupts.
5723
///
5824
/// # Example
@@ -88,7 +54,7 @@ impl Evented for PollWrapper {
8854
/// # }
8955
/// ```
9056
pub struct AsyncLineEventHandle {
91-
evented: PollEvented<PollWrapper>,
57+
asyncfd: AsyncFd<LineEventHandle>,
9258
}
9359

9460
impl AsyncLineEventHandle {
@@ -106,36 +72,35 @@ impl AsyncLineEventHandle {
10672
}
10773

10874
Ok(AsyncLineEventHandle {
109-
evented: PollEvented::new(PollWrapper { handle })?,
75+
asyncfd: AsyncFd::new(handle)?,
11076
})
11177
}
11278
}
11379

11480
impl Stream for AsyncLineEventHandle {
11581
type Item = Result<LineEvent>;
11682

117-
fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
118-
let ready = Ready::readable();
119-
if let Err(e) = ready!(self.evented.poll_read_ready(cx, ready)) {
120-
return Poll::Ready(Some(Err(e.into())));
121-
}
122-
123-
match self.evented.get_ref().handle.read_event() {
124-
Ok(Some(event)) => Poll::Ready(Some(Ok(event))),
125-
Ok(None) => Poll::Ready(Some(Err(event_err(nix::Error::Sys(
126-
nix::errno::Errno::EIO,
127-
))))),
128-
Err(nix::Error::Sys(nix::errno::Errno::EAGAIN)) => {
129-
self.evented.clear_read_ready(cx, ready)?;
130-
Poll::Pending
83+
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
84+
loop {
85+
let mut guard = ready!(self.asyncfd.poll_read_ready_mut(cx))?;
86+
match guard.try_io(|inner| inner.get_mut().read_event()) {
87+
Err(TryIoError { .. }) => {
88+
// Continue
89+
}
90+
Ok(Ok(Some(event))) => return Poll::Ready(Some(Ok(event))),
91+
Ok(Ok(None)) => {
92+
return Poll::Ready(Some(Err(event_err(nix::Error::Sys(
93+
nix::errno::Errno::EIO,
94+
)))))
95+
}
96+
Ok(Err(err)) => return Poll::Ready(Some(Err(err.into()))),
13197
}
132-
Err(e) => Poll::Ready(Some(Err(event_err(e)))),
13398
}
13499
}
135100
}
136101

137102
impl AsRef<LineEventHandle> for AsyncLineEventHandle {
138103
fn as_ref(&self) -> &LineEventHandle {
139-
&self.evented.get_ref().handle
104+
&self.asyncfd.get_ref()
140105
}
141106
}

src/lib.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ extern crate nix;
9292
use std::cmp::min;
9393
use std::ffi::CStr;
9494
use std::fs::{read_dir, File, ReadDir};
95+
use std::io::Read;
9596
use std::mem;
9697
use std::ops::Index;
9798
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
@@ -954,11 +955,11 @@ impl LineEventHandle {
954955
/// This blocks while there is not another event available from the
955956
/// kernel for the line which matches the subscription criteria
956957
/// specified in the `event_flags` when the handle was created.
957-
pub fn get_event(&self) -> Result<LineEvent> {
958+
pub fn get_event(&mut self) -> Result<LineEvent> {
958959
match self.read_event() {
959960
Ok(Some(event)) => Ok(event),
960961
Ok(None) => Err(event_err(nix::Error::Sys(nix::errno::Errno::EIO))),
961-
Err(e) => Err(event_err(e)),
962+
Err(e) => Err(e.into()),
962963
}
963964
}
964965

@@ -981,19 +982,15 @@ impl LineEventHandle {
981982

982983
/// Helper function which returns the line event if a complete event was read, Ok(None) if not
983984
/// enough data was read or the error returned by `read()`.
984-
///
985-
/// This function allows access to the raw `nix::Error` as required, for example, to theck
986-
/// whether read() returned -EAGAIN.
987-
pub(crate) fn read_event(&self) -> std::result::Result<Option<LineEvent>, nix::Error> {
985+
pub(crate) fn read_event(&mut self) -> std::io::Result<Option<LineEvent>> {
988986
let mut data: ffi::gpioevent_data = unsafe { mem::zeroed() };
989987
let mut data_as_buf = unsafe {
990988
slice::from_raw_parts_mut(
991989
&mut data as *mut ffi::gpioevent_data as *mut u8,
992990
mem::size_of::<ffi::gpioevent_data>(),
993991
)
994992
};
995-
let bytes_read = nix::unistd::read(self.file.as_raw_fd(), &mut data_as_buf)?;
996-
993+
let bytes_read = self.file.read(&mut data_as_buf)?;
997994
if bytes_read != mem::size_of::<ffi::gpioevent_data>() {
998995
Ok(None)
999996
} else {
@@ -1016,7 +1013,7 @@ impl Iterator for LineEventHandle {
10161013
match self.read_event() {
10171014
Ok(None) => None,
10181015
Ok(Some(event)) => Some(Ok(event)),
1019-
Err(e) => Some(Err(event_err(e))),
1016+
Err(e) => Some(Err(e.into())),
10201017
}
10211018
}
10221019
}

0 commit comments

Comments
 (0)