Crates.io | linux-aio-tokio |
lib.rs | linux-aio-tokio |
version | 0.3.0 |
source | src |
created_at | 2020-04-15 20:29:48.014664 |
updated_at | 2020-04-27 10:53:27.4841 |
description | Tokio bindings for Linux kernel AIO |
homepage | |
repository | https://github.com/glebpom/linux-aio-tokio |
max_upload_size | |
id | 230600 |
size | 114,328 |
This package provides an integration of Linux kernel-level asynchronous I/O to the Tokio platform.
Linux kernel-level asynchronous I/O is different from the Posix AIO library. Posix AIO is implemented using a pool of userland threads, which invoke regular, blocking system calls to perform file I/O. Linux kernel-level AIO, on the other hand, provides kernel-level asynchronous scheduling of I/O operations to the underlying block device.
Add this to your Cargo.toml
:
[dependencies]
linux-aio-tokio = "0.3"
use std::fs::OpenOptions;
use tempfile::tempdir;
use linux_aio_tokio::{aio_context, AioOpenOptionsExt, LockedBuf, ReadFlags, WriteFlags};
#[tokio::main]
async fn main() {
let (aio, aio_handle) = aio_context(8, true).unwrap();
let dir = tempdir().unwrap();
let mut open_options = OpenOptions::new();
open_options
.read(true)
.create_new(true)
.append(true)
.write(true);
let file = open_options
.aio_open(dir.path().join("tmp"), false)
.await
.unwrap();
let mut write_buf = LockedBuf::with_size(1024).unwrap();
for i in 0..write_buf.size() {
write_buf.as_mut()[i] = (i % 0xff) as u8;
}
file.write_at(&aio_handle, 0, &write_buf, 1024, WriteFlags::APPEND)
.await
.unwrap();
let mut read_buf = LockedBuf::with_size(1024).unwrap();
file.read_at(&aio_handle, 0, &mut read_buf, 1024, ReadFlags::empty())
.await
.unwrap();
assert_eq!(read_buf.as_ref(), write_buf.as_ref());
aio.close().await;
println!("all good!");
}
This code is licensed under the MIT license.
The current implementation is based on the code created by Hans-Martin Will, available at GitHub repository.