1 个不稳定版本

0.1.0 2024年3月31日

#180科学

Apache-2.0/MIT

96KB
391

io-uring-epoll

Discord chat Crates.io Docs License License MSRV

meme what If I told you your epoll is in your io_uring

当你的 io_uring 遇上你的 epoll 🥰

通过 io_uring 接口设置文件句柄就绪检查,特别是在有大量开关就绪活动的繁忙事件循环中,可以节省系统调用。

请注意,epoll 与常规 poll 不同,仅在 Linux 内核中可用。

Epoll 本身已在 Linux 内核中存在约20年,但 io_uring 最近添加了 EpollCtl OpCode 支持,以便绕过控制它的系统调用需求。

这是一个非可移植实现,因为 Windows I/O 环或 MacOS 没有提供与其相关的 epoll 实现的任何东西(如果有的话)。

添加

cargo add io-uring-epoll

示例

use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::os::fd::AsRawFd;
use io_uring_epoll::{HandledFd, EpollHandler};

// The 10 denotes power of two capacity to io_uring::IoUring
let mut handler = EpollHandler::new(10).expect("Unable to create EPoll Handler");

// This works with any impl that provides std::os::fd::AsRawFd impl
// In POSIX/UNIX-like it's just i32 file number or "fileno"
let listen = std::net::TcpListener::bind(SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 0)).unwrap();

// Add the listen handle into EpollHandler
let mut handle_fd = HandledFd::new(listen.as_raw_fd());
let set_mask = handle_fd.set_in(true);
handler.add_fd(&handle_fd);

// Prepare a commit all changes into io_uring::SubmissionQueue
let handle_status = handler.prepare_submit().unwrap();

// async version is with submit()
handler.submit_and_wait(1).unwrap();

// Get the underlying io_uring::cqeueu::CompletionQueue
let mut c_queue = handler.io_uring().completion();

// Note: This may not have finished so may need to wait for it
if c_queue.is_empty() == false {
    let cqes: Vec<io_uring::cqueue::Entry> = c_queue.take_while(|i| {
        dbg!(i);
        false
    }).collect();
}

许可协议

许可协议为以下之一

贡献

除非您明确声明,否则您提交的任何贡献,按照 Apache-2.0 许可证的定义,将作为上述双许可使用,没有额外的条款或条件。

依赖项

~395KB