pub struct Poller { /* private fields */ }
Expand description
Waits for I/O events.
Implementations§
source§impl Poller
impl Poller
sourcepub fn supports_level(&self) -> bool
pub fn supports_level(&self) -> bool
Tell whether or not this Poller
supports level-triggered polling.
sourcepub fn supports_edge(&self) -> bool
pub fn supports_edge(&self) -> bool
Tell whether or not this Poller
supports edge-triggered polling.
sourcepub unsafe fn add(
&self,
source: impl AsRawSource,
interest: Event
) -> Result<()>
pub unsafe fn add( &self, source: impl AsRawSource, interest: Event ) -> Result<()>
Adds a file descriptor or socket to the poller.
A file descriptor or socket is considered readable or writable when a read or write operation on it would not block. This doesn’t mean the read or write operation will succeed, it only means the operation will return immediately.
If interest is set in both readability and writability, the two kinds of events might be delivered either separately or together.
For example, interest in Event { key: 7, readable: true, writable: true }
might result in
a single Event
of the same form, or in two separate Event
s:
Event { key: 7, readable: true, writable: false }
Event { key: 7, readable: false, writable: true }
Note that interest in I/O events needs to be re-enabled using
modify()
again after an event is delivered if we’re interested in
the next event of the same kind.
It is possible to register interest in the same file descriptor or socket using multiple
separate Poller
instances. When the event is delivered, one or more Poller
s are
notified with that event. The exact number of Poller
s notified depends on the
underlying platform. When registering multiple sources into one event, the user should
be careful to accommodate for events lost to other pollers.
One may also register one source into other, non-polling
event loops, like GLib’s
context. While the plumbing will vary from platform to platform, in general the Poller
will act as if the source was registered with another Poller
, with the same caveats
as above.
Safety
The source must be delete()
d from this Poller
before it is dropped.
Errors
This method returns an error in the following situations:
- If
key
equalsusize::MAX
because that key is reserved for internal use. - If an error is returned by the syscall.
Examples
Set interest in all events:
use polling::{Event, Poller};
let source = std::net::TcpListener::bind("127.0.0.1:0")?;
source.set_nonblocking(true)?;
let key = 7;
let poller = Poller::new()?;
unsafe {
poller.add(&source, Event::all(key))?;
}
poller.delete(&source)?;
sourcepub unsafe fn add_with_mode(
&self,
source: impl AsRawSource,
interest: Event,
mode: PollMode
) -> Result<()>
pub unsafe fn add_with_mode( &self, source: impl AsRawSource, interest: Event, mode: PollMode ) -> Result<()>
Adds a file descriptor or socket to the poller in the specified mode.
This is identical to the add()
function, but allows specifying the
polling mode to use for this socket.
Safety
The source must be delete()
d from this Poller
before it is dropped.
Errors
If the operating system does not support the specified mode, this function will return an error.
sourcepub fn modify(&self, source: impl AsSource, interest: Event) -> Result<()>
pub fn modify(&self, source: impl AsSource, interest: Event) -> Result<()>
Modifies the interest in a file descriptor or socket.
This method has the same behavior as add()
except it modifies the
interest of a previously added file descriptor or socket.
To use this method with a file descriptor or socket, you must first add it using
add()
.
Note that interest in I/O events needs to be re-enabled using
modify()
again after an event is delivered if we’re interested in
the next event of the same kind.
Errors
This method returns an error in the following situations:
- If
key
equalsusize::MAX
because that key is reserved for internal use. - If an error is returned by the syscall.
Examples
To enable interest in all events:
poller.modify(&source, Event::all(key))?;
To enable interest in readable events and disable interest in writable events:
poller.modify(&source, Event::readable(key))?;
To disable interest in readable events and enable interest in writable events:
poller.modify(&source, Event::writable(key))?;
To disable interest in all events:
poller.modify(&source, Event::none(key))?;
sourcepub fn modify_with_mode(
&self,
source: impl AsSource,
interest: Event,
mode: PollMode
) -> Result<()>
pub fn modify_with_mode( &self, source: impl AsSource, interest: Event, mode: PollMode ) -> Result<()>
Modifies interest in a file descriptor or socket to the poller, but with the specified mode.
This is identical to the modify()
function, but allows specifying the polling mode
to use for this socket.
Performance Notes
This function can be used to change a source from one polling mode to another. However, on some platforms, this switch can cause delays in the delivery of events.
Errors
If the operating system does not support the specified mode, this function will return an error.
sourcepub fn delete(&self, source: impl AsSource) -> Result<()>
pub fn delete(&self, source: impl AsSource) -> Result<()>
Removes a file descriptor or socket from the poller.
Unlike add()
, this method only removes the file descriptor or
socket from the poller without putting it back into blocking mode.
Examples
use polling::{Event, Poller};
use std::net::TcpListener;
let socket = TcpListener::bind("127.0.0.1:0")?;
socket.set_nonblocking(true)?;
let key = 7;
let poller = Poller::new()?;
unsafe { poller.add(&socket, Event::all(key))?; }
poller.delete(&socket)?;
sourcepub fn wait(
&self,
events: &mut Events,
timeout: Option<Duration>
) -> Result<usize>
pub fn wait( &self, events: &mut Events, timeout: Option<Duration> ) -> Result<usize>
Waits for at least one I/O event and returns the number of new events.
New events will be appended to events
. If necessary, make sure to clear the
Events
before calling wait()
!
This method will return with no new events if a notification is delivered by the
notify()
method, or the timeout is reached. Sometimes it may even return with no events
spuriously.
Only one thread can wait on I/O. If another thread is already in wait()
, concurrent
calls to this method will return immediately with no new events.
If the operating system is ready to deliver a large number of events at once, this method may decide to deliver them in smaller batches.
Examples
use polling::{Event, Events, Poller};
use std::net::TcpListener;
use std::time::Duration;
let socket = TcpListener::bind("127.0.0.1:0")?;
socket.set_nonblocking(true)?;
let key = 7;
let poller = Poller::new()?;
unsafe {
poller.add(&socket, Event::all(key))?;
}
let mut events = Events::new();
let n = poller.wait(&mut events, Some(Duration::from_secs(1)))?;
poller.delete(&socket)?;
sourcepub fn notify(&self) -> Result<()>
pub fn notify(&self) -> Result<()>
Wakes up the current or the following invocation of wait()
.
If no thread is calling wait()
right now, this method will cause the following call
to wake up immediately.
Examples
use polling::{Events, Poller};
let poller = Poller::new()?;
// Notify the poller.
poller.notify()?;
let mut events = Events::new();
poller.wait(&mut events, None)?; // wakes up immediately
assert!(events.is_empty());