Skip to content

Commit 57b95cb

Browse files
committed
Make Poll a Source itself
1 parent 9a9d691 commit 57b95cb

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/poll.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ use std::{fmt, io};
2323

2424
use crate::{event, sys, Events, Interest, Token};
2525

26+
#[cfg(all(unix, feature = "os-ext"))]
27+
use crate::io_source::IoSource;
28+
2629
/// Polls for readiness events on all registered values.
2730
///
2831
/// `Poll` allows a program to monitor a large number of [`event::Source`]s,
@@ -265,6 +268,9 @@ use crate::{event, sys, Events, Interest, Token};
265268
/// [`SourceFd`]: unix/struct.SourceFd.html
266269
/// [`Poll::poll`]: struct.Poll.html#method.poll
267270
pub struct Poll {
271+
#[cfg(all(unix, feature = "os-ext"))]
272+
registry: IoSource<Registry>,
273+
#[cfg(not(all(unix, feature = "os-ext")))]
268274
registry: Registry,
269275
}
270276

@@ -320,6 +326,13 @@ impl Poll {
320326
/// ```
321327
pub fn new() -> io::Result<Poll> {
322328
sys::Selector::new().map(|selector| Poll {
329+
#[cfg(all(unix, feature = "os-ext"))]
330+
registry: IoSource::new(Registry {
331+
selector,
332+
#[cfg(all(debug_assertions, not(target_os = "wasi")))]
333+
has_waker: Arc::new(AtomicBool::new(false)),
334+
}),
335+
#[cfg(not(all(unix, feature = "os-ext")))]
323336
registry: Registry {
324337
selector,
325338
#[cfg(all(debug_assertions, not(target_os = "wasi")))]
@@ -464,6 +477,31 @@ impl fmt::Debug for Poll {
464477
}
465478
}
466479

480+
#[cfg(all(unix, feature = "os-ext"))]
481+
impl event::Source for Poll {
482+
fn register(
483+
&mut self,
484+
registry: &Registry,
485+
token: Token,
486+
interests: Interest,
487+
) -> io::Result<()> {
488+
registry.register(&mut self.registry, token, interests)
489+
}
490+
491+
fn reregister(
492+
&mut self,
493+
registry: &Registry,
494+
token: Token,
495+
interests: Interest,
496+
) -> io::Result<()> {
497+
registry.reregister(&mut self.registry, token, interests)
498+
}
499+
500+
fn deregister(&mut self, registry: &Registry) -> io::Result<()> {
501+
registry.deregister(&mut self.registry)
502+
}
503+
}
504+
467505
impl Registry {
468506
/// Register an [`event::Source`] with the `Poll` instance.
469507
///

tests/poll.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,3 +663,16 @@ pub fn assert_error<T, E: fmt::Display>(result: Result<T, E>, expected_msg: &str
663663
),
664664
}
665665
}
666+
667+
#[cfg(all(unix, feature = "os-ext"))]
668+
#[test]
669+
fn double_poll() {
670+
init();
671+
let outer_poll = Poll::new().unwrap();
672+
let registry = outer_poll.registry();
673+
674+
let mut inner_poll = Poll::new().unwrap();
675+
let token = Token(0);
676+
let interests = Interest::READABLE;
677+
registry.register(&mut inner_poll, token, interests).unwrap();
678+
}

0 commit comments

Comments
 (0)