Crates.io | fluke-io-uring-async |
lib.rs | fluke-io-uring-async |
version | 0.1.0 |
source | src |
created_at | 2024-05-28 22:13:47.284937 |
updated_at | 2024-05-28 22:13:47.284937 |
description | An abstraction on top of io-uring |
homepage | |
repository | https://github.com/bearcove/fluke |
max_upload_size | |
id | 1254883 |
size | 15,134 |
This is the fluke fork of https://github.com/thomasbarrett/io-uring-async
The original README follows.
IoUringAsync is a thin async compatability layer over the commonly used io-uring library that makes it easier to use with the Tokio runtime.
This project is heavily inspired by the tokio-uring project. Unlike tokio-uring, IoUringAsync is not its own runtime. Instead, it is a lightweight collection of mostly runtime-agnostic future.
Currently, this project does not support multishot io_uring
operations.
let sqe = opcode::Write(...).build();
let fut = uring.push(sqe);
uring.submit();
let cqe = fut.await;
use std::rc::Rc;
use io_uring::{squeue, cqueue, opcode};
use io_uring_async::IoUringAsync;
use send_wrapper::SendWrapper;
fn main() {
let uring = IoUringAsync::new(8).unwrap();
let uring = Rc::new(uring);
// Create a new current_thread runtime that submits all outstanding submission queue
// entries as soon as the executor goes idle.
let uring_clone = SendWrapper::new(uring.clone());
let runtime = tokio::runtime::Builder::new_current_thread().
on_thread_park(move || { uring_clone.submit().unwrap(); }).
enable_all().
build().unwrap();
runtime.block_on(async move {
tokio::task::LocalSet::new().run_until(async {
// Spawn a task that waits for the io_uring to become readable and handles completion
// queue entries accordingly.
tokio::task::spawn_local(IoUringAsync::listen(uring.clone()));
let cqe = uring.push(Nop::new().build()).await;
assert!(cqe.result() >= 0, "nop error: {}", cqe.result());
}).await;
});
}