43 releases (stable)

3.7.4 Nov 7, 2024
3.7.2 Jun 15, 2024
3.6.0 Mar 24, 2024
3.3.1 Nov 24, 2023
0.1.9 Sep 6, 2020

#17 in Asynchronous

Download history 893492/week @ 2025-01-03 1076384/week @ 2025-01-10 963392/week @ 2025-01-17 1014841/week @ 2025-01-24 1093542/week @ 2025-01-31 1287751/week @ 2025-02-07 1236037/week @ 2025-02-14 1370904/week @ 2025-02-21 1404523/week @ 2025-02-28 1432028/week @ 2025-03-07 1544382/week @ 2025-03-14 2335774/week @ 2025-03-21 1544955/week @ 2025-03-28 1570064/week @ 2025-04-04 1354013/week @ 2025-04-11 956649/week @ 2025-04-18

5,716,474 downloads per month
Used in 5,864 crates (34 directly)

Apache-2.0 OR MIT

200KB
4K SLoC

polling

Build License Cargo Documentation

Portable interface to epoll, kqueue, event ports, and IOCP.

Supported platforms:

  • epoll: Linux, Android, RedoxOS
  • kqueue: macOS, iOS, tvOS, watchOS, visionOS, FreeBSD, NetBSD, OpenBSD, DragonFly BSD
  • event ports: illumos, Solaris
  • poll: VxWorks, Fuchsia, HermitOS, other Unix systems
  • IOCP: Windows, Wine (version 7.13+)

Polling is done in oneshot mode, which means interest in I/O events needs to be reset after an event is delivered if we're interested in the next event of the same kind.

Only one thread can be waiting for I/O events at a time.

Examples

use polling::{Event, Poller};
use std::net::TcpListener;

// Create a TCP listener.
let socket = TcpListener::bind("127.0.0.1:8000")?;
socket.set_nonblocking(true)?;
let key = 7; // Arbitrary key identifying the socket.

// Create a poller and register interest in readability on the socket.
let poller = Poller::new()?;
poller.add(&socket, Event::readable(key))?;

// The event loop.
let mut events = Vec::new();
loop {
    // Wait for at least one I/O event.
    events.clear();
    poller.wait(&mut events, None)?;

    for ev in &events {
        if ev.key == key {
            // Perform a non-blocking accept operation.
            socket.accept()?;
            // Set interest in the next readability event.
            poller.modify(&socket, Event::readable(key))?;
        }
    }
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~2–12MB
~158K SLoC