Skip to content

Commit 2f56696

Browse files
committed
Add a tokio feature flag
This flag enables some extra methods needed to register a mio_aio object with a Tokio reactor. They're basically the same as mio::event::Source, but deliberately different because Tokio wants to conceal the fact that it's using mio.
1 parent a740a87 commit 2f56696

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
- Updated mio to 0.7.
1010

11+
- Added a `tokio` feature flag, which enables extra methods needed by a mio-aio
12+
consumers that wish to implement Tokio's `AioSource` trait.
13+
1114
## [0.5.0] - 2021-05-31
1215

1316
### Changed

Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,15 @@ documentation = "https://asomers.github.io/mio-aio/mio_aio/"
1515
exclude = ["release.toml"]
1616

1717
[package.metadata.docs.rs]
18+
rustdoc-args = ["--cfg", "docsrs"]
1819
targets = [
1920
"x86_64-unknown-freebsd",
2021
]
2122

23+
[features]
24+
default = []
25+
tokio = []
26+
2227
[dependencies]
2328
mio = "0.7.0"
2429
nix = "0.22.0"

src/aio.rs

+52-8
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ impl<'a> AioCb<'a> {
8080
self.inner.cancel()
8181
} // LCOV_EXCL_LINE
8282

83+
fn _deregister_raw(&mut self) {
84+
let sigev = SigevNotify::SigevNone;
85+
self.inner.set_sigev_notify(sigev);
86+
}
87+
88+
/// Extra registration method needed by Tokio
89+
#[cfg(feature = "tokio")]
90+
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
91+
pub fn deregister_raw(&mut self) {
92+
self._deregister_raw()
93+
}
94+
8395
/// Retrieve the status of an in-progress or complete operation.
8496
///
8597
/// Not usually needed, since `mio_aio` always uses kqueue for notification.
@@ -97,6 +109,18 @@ impl<'a> AioCb<'a> {
97109
self.inner.read()
98110
} // LCOV_EXCL_LINE
99111

112+
fn _register_raw(&mut self, kq: RawFd, udata: usize) {
113+
let sigev = SigevNotify::SigevKevent{kq, udata: udata as isize};
114+
self.inner.set_sigev_notify(sigev);
115+
}
116+
117+
/// Extra registration method needed by Tokio
118+
#[cfg(feature = "tokio")]
119+
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
120+
pub fn register_raw(&mut self, kq: RawFd, udata: usize) {
121+
self._register_raw(kq, udata)
122+
}
123+
100124
/// Asynchronously write to a file.
101125
pub fn write(&mut self) -> nix::Result<()> {
102126
self.inner.write()
@@ -113,8 +137,7 @@ impl<'a> Source for AioCb<'a> {
113137
assert!(interests.is_aio());
114138
let udata = usize::from(token);
115139
let kq = registry.as_raw_fd();
116-
let sigev = SigevNotify::SigevKevent{kq, udata: udata as isize};
117-
self.inner.set_sigev_notify(sigev);
140+
self._register_raw(kq, udata);
118141
Ok(())
119142
}
120143

@@ -128,8 +151,7 @@ impl<'a> Source for AioCb<'a> {
128151
}
129152

130153
fn deregister(&mut self, _registry: &Registry) -> io::Result<()> {
131-
let sigev = SigevNotify::SigevNone;
132-
self.inner.set_sigev_notify(sigev);
154+
self._deregister_raw();
133155
Ok(())
134156
}
135157
}
@@ -146,6 +168,18 @@ pub struct LioCb<'a> {
146168
// LCOV_EXCL_STOP
147169

148170
impl<'a> LioCb<'a> {
171+
fn _deregister_raw(&mut self) {
172+
let sigev = SigevNotify::SigevNone;
173+
self.sev = sigev;
174+
}
175+
176+
/// Extra registration method needed by Tokio
177+
#[cfg(feature = "tokio")]
178+
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
179+
pub fn deregister_raw(&mut self) {
180+
self._deregister_raw()
181+
}
182+
149183
/// Translate the operating system's somewhat unhelpful error from
150184
/// `lio_listio` into something more useful.
151185
fn fix_submit_error(&mut self, e: nix::Result<()>) -> Result<(), LioError> {
@@ -203,6 +237,18 @@ impl<'a> LioCb<'a> {
203237
}
204238
}
205239

240+
fn _register_raw(&mut self, kq: RawFd, udata: usize) {
241+
let sigev = SigevNotify::SigevKevent{kq, udata: udata as isize};
242+
self.sev = sigev;
243+
}
244+
245+
/// Extra registration method needed by Tokio
246+
#[cfg(feature = "tokio")]
247+
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
248+
pub fn register_raw(&mut self, kq: RawFd, udata: usize) {
249+
self._register_raw(kq, udata)
250+
}
251+
206252
/// Submit an `LioCb` to the `aio(4)` subsystem.
207253
///
208254
/// If the return value is [`LioError::EAGAIN`], then no operations were
@@ -264,8 +310,7 @@ impl<'a> Source for LioCb<'a> {
264310
assert!(interests.is_lio());
265311
let udata = usize::from(token);
266312
let kq = registry.as_raw_fd();
267-
let sigev = SigevNotify::SigevKevent{kq, udata: udata as isize};
268-
self.sev = sigev;
313+
self._register_raw(kq, udata);
269314
Ok(())
270315
}
271316

@@ -279,8 +324,7 @@ impl<'a> Source for LioCb<'a> {
279324
}
280325

281326
fn deregister(&mut self, _registry: &Registry) -> io::Result<()> {
282-
let sigev = SigevNotify::SigevNone;
283-
self.sev = sigev;
327+
self._deregister_raw();
284328
Ok(())
285329
}
286330
}

src/lib.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
//! MIO bindings for POSIX AIO
2+
//!
3+
//! # Feature Flags
4+
//!
5+
//! * `tokio` - Add extra methods needed for consumers to implement Tokio's
6+
//! `AioSource` trait.
7+
#![cfg_attr(docsrs, feature(doc_cfg))]
28

39
mod aio;
410

0 commit comments

Comments
 (0)