Skip to content

Commit 6d44537

Browse files
bors[bot]oll3
andauthored
Merge #55
55: chore: bump tokio to v1 r=ryankurte a=oll3 Bump tokio to version 1.x. Use tokio AsyncFd since tokio no longer exposes mio internals. Co-authored-by: Olle Sandberg <[email protected]>
2 parents 246f5ba + 3618b02 commit 6d44537

File tree

6 files changed

+36
-67
lines changed

6 files changed

+36
-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

+3-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,13 +23,13 @@ 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", "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"
3231
anyhow = "1.0"
32+
tokio = { version = "1", features = ["io-std", "rt-multi-thread", "macros", "net"] }
3333

3434
[package.metadata.docs.rs]
3535
# To build locally:

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)